Tizen 2.0 Release tizen_2.0 accepted/tizen_2.0/20130215.203047 submit/tizen_2.0/20130215.191844
authorHyungKyu Song <hk76.song@samsung.com>
Fri, 15 Feb 2013 15:19:33 +0000 (00:19 +0900)
committerHyungKyu Song <hk76.song@samsung.com>
Fri, 15 Feb 2013 15:19:33 +0000 (00:19 +0900)
400 files changed:
COPYING [new file with mode: 0644]
ChangeLog [new file with mode: 0644]
INSTALL [new file with mode: 0644]
Makefile.am [new file with mode: 0644]
README [new file with mode: 0644]
configure.ac [new file with mode: 0644]
docbook.am [new file with mode: 0644]
include/Makefile.am [new file with mode: 0644]
include/X11/CallbackI.h [new file with mode: 0644]
include/X11/Composite.h [new file with mode: 0644]
include/X11/CompositeP.h [new file with mode: 0644]
include/X11/ConstrainP.h [new file with mode: 0644]
include/X11/Constraint.h [new file with mode: 0644]
include/X11/ConvertI.h [new file with mode: 0644]
include/X11/Core.h [new file with mode: 0644]
include/X11/CoreP.h [new file with mode: 0644]
include/X11/CreateI.h [new file with mode: 0644]
include/X11/EventI.h [new file with mode: 0644]
include/X11/HookObjI.h [new file with mode: 0644]
include/X11/InitialI.h [new file with mode: 0644]
include/X11/Intrinsic.h [new file with mode: 0644]
include/X11/IntrinsicI.h [new file with mode: 0644]
include/X11/IntrinsicP.h [new file with mode: 0644]
include/X11/Object.h [new file with mode: 0644]
include/X11/ObjectP.h [new file with mode: 0644]
include/X11/PassivGraI.h [new file with mode: 0644]
include/X11/RectObj.h [new file with mode: 0644]
include/X11/RectObjP.h [new file with mode: 0644]
include/X11/ResConfigP.h [new file with mode: 0644]
include/X11/ResourceI.h [new file with mode: 0644]
include/X11/SelectionI.h [new file with mode: 0644]
include/X11/ShellI.h [new file with mode: 0644]
include/X11/ShellP.h [new file with mode: 0644]
include/X11/ThreadsI.h [new file with mode: 0644]
include/X11/TranslateI.h [new file with mode: 0644]
include/X11/VarargsI.h [new file with mode: 0644]
include/X11/Vendor.h [new file with mode: 0644]
include/X11/VendorP.h [new file with mode: 0644]
include/X11/Xtos.h [new file with mode: 0644]
m4/ax_define_dir.m4 [new file with mode: 0644]
man/Makefile.am [new file with mode: 0644]
man/MenuPopdown.man [new file with mode: 0644]
man/MenuPopup.man [new file with mode: 0644]
man/XtAddActions.man [new file with mode: 0644]
man/XtAddCallback.man [new file with mode: 0644]
man/XtAddCallbacks.man [new file with mode: 0644]
man/XtAddConverter.man [new file with mode: 0644]
man/XtAddEventHandler.man [new file with mode: 0644]
man/XtAddExposureToRegion.man [new file with mode: 0644]
man/XtAddGrab.man [new file with mode: 0644]
man/XtAddInput.man [new file with mode: 0644]
man/XtAddRawEventHandler.man [new file with mode: 0644]
man/XtAddTimeOut.man [new file with mode: 0644]
man/XtAddWorkProc.man [new file with mode: 0644]
man/XtAllocateGC.man [new file with mode: 0644]
man/XtAppAddActionHook.man [new file with mode: 0644]
man/XtAppAddActions.man [new file with mode: 0644]
man/XtAppAddBlockHook.man [new file with mode: 0644]
man/XtAppAddConverter.man [new file with mode: 0644]
man/XtAppAddInput.man [new file with mode: 0644]
man/XtAppAddSignal.man [new file with mode: 0644]
man/XtAppAddTimeOut.man [new file with mode: 0644]
man/XtAppAddWorkProc.man [new file with mode: 0644]
man/XtAppCreateShell.man [new file with mode: 0644]
man/XtAppError.man [new file with mode: 0644]
man/XtAppErrorMsg.man [new file with mode: 0644]
man/XtAppGetErrorDatabase.man [new file with mode: 0644]
man/XtAppGetErrorDatabaseText.man [new file with mode: 0644]
man/XtAppGetExitFlag.man [new file with mode: 0644]
man/XtAppGetSelectionTimeout.man [new file with mode: 0644]
man/XtAppInitialize.man [new file with mode: 0644]
man/XtAppLock.man [new file with mode: 0644]
man/XtAppMainLoop.man [new file with mode: 0644]
man/XtAppNextEvent.man [new file with mode: 0644]
man/XtAppPeekEvent.man [new file with mode: 0644]
man/XtAppPending.man [new file with mode: 0644]
man/XtAppProcessEvent.man [new file with mode: 0644]
man/XtAppReleaseCacheRefs.man [new file with mode: 0644]
man/XtAppSetErrorHandler.man [new file with mode: 0644]
man/XtAppSetErrorMsgHandler.man [new file with mode: 0644]
man/XtAppSetExitFlag.man [new file with mode: 0644]
man/XtAppSetFallbackResources.man [new file with mode: 0644]
man/XtAppSetSelectionTimeout.man [new file with mode: 0644]
man/XtAppSetTypeConverter.man [new file with mode: 0644]
man/XtAppSetWarningHandler.man [new file with mode: 0644]
man/XtAppSetWarningMsgHandler.man [new file with mode: 0644]
man/XtAppUnlock.man [new file with mode: 0644]
man/XtAppWarning.man [new file with mode: 0644]
man/XtAppWarningMsg.man [new file with mode: 0644]
man/XtAsprintf.man [new file with mode: 0644]
man/XtAugmentTranslations.man [new file with mode: 0644]
man/XtBuildEventMask.man [new file with mode: 0644]
man/XtCallAcceptFocus.man [new file with mode: 0644]
man/XtCallActionProc.man [new file with mode: 0644]
man/XtCallCallbackList.man [new file with mode: 0644]
man/XtCallCallbacks.man [new file with mode: 0644]
man/XtCallConverter.man [new file with mode: 0644]
man/XtCallbackExclusive.man [new file with mode: 0644]
man/XtCallbackNone.man [new file with mode: 0644]
man/XtCallbackNonexclusive.man [new file with mode: 0644]
man/XtCallbackPopdown.man [new file with mode: 0644]
man/XtCalloc.man [new file with mode: 0644]
man/XtCancelSelectionRequest.man [new file with mode: 0644]
man/XtChangeManagedSet.man [new file with mode: 0644]
man/XtCheckSubclass.man [new file with mode: 0644]
man/XtClass.man [new file with mode: 0644]
man/XtCloseDisplay.man [new file with mode: 0644]
man/XtConfigureWidget.man [new file with mode: 0644]
man/XtConvert.man [new file with mode: 0644]
man/XtConvertAndStore.man [new file with mode: 0644]
man/XtConvertCase.man [new file with mode: 0644]
man/XtCreateApplicationContext.man [new file with mode: 0644]
man/XtCreateApplicationShell.man [new file with mode: 0644]
man/XtCreateManagedWidget.man [new file with mode: 0644]
man/XtCreatePopupShell.man [new file with mode: 0644]
man/XtCreateSelectionRequest.man [new file with mode: 0644]
man/XtCreateWidget.man [new file with mode: 0644]
man/XtCreateWindow.man [new file with mode: 0644]
man/XtDatabase.man [new file with mode: 0644]
man/XtDestroyApplicationContext.man [new file with mode: 0644]
man/XtDestroyWidget.man [new file with mode: 0644]
man/XtDirectConvert.man [new file with mode: 0644]
man/XtDisownSelection.man [new file with mode: 0644]
man/XtDispatchEvent.man [new file with mode: 0644]
man/XtDispatchEventToWidget.man [new file with mode: 0644]
man/XtDisplay.man [new file with mode: 0644]
man/XtDisplayInitialize.man [new file with mode: 0644]
man/XtDisplayOfObject.man [new file with mode: 0644]
man/XtDisplayStringConversionWarning.man [new file with mode: 0644]
man/XtDisplayToApplicationContext.man [new file with mode: 0644]
man/XtError.man [new file with mode: 0644]
man/XtErrorMsg.man [new file with mode: 0644]
man/XtFindFile.man [new file with mode: 0644]
man/XtFree.man [new file with mode: 0644]
man/XtGetActionKeysym.man [new file with mode: 0644]
man/XtGetActionList.man [new file with mode: 0644]
man/XtGetApplicationNameAndClass.man [new file with mode: 0644]
man/XtGetApplicationResources.man [new file with mode: 0644]
man/XtGetClassExtension.man [new file with mode: 0644]
man/XtGetConstraintResourceList.man [new file with mode: 0644]
man/XtGetDisplays.man [new file with mode: 0644]
man/XtGetErrorDatabase.man [new file with mode: 0644]
man/XtGetErrorDatabaseText.man [new file with mode: 0644]
man/XtGetGC.man [new file with mode: 0644]
man/XtGetKeyboardFocusWidget.man [new file with mode: 0644]
man/XtGetKeysymTable.man [new file with mode: 0644]
man/XtGetMultiClickTime.man [new file with mode: 0644]
man/XtGetResourceList.man [new file with mode: 0644]
man/XtGetSelectionParameters.man [new file with mode: 0644]
man/XtGetSelectionRequest.man [new file with mode: 0644]
man/XtGetSelectionTimeout.man [new file with mode: 0644]
man/XtGetSelectionValue.man [new file with mode: 0644]
man/XtGetSelectionValueIncremental.man [new file with mode: 0644]
man/XtGetSelectionValues.man [new file with mode: 0644]
man/XtGetSelectionValuesIncremental.man [new file with mode: 0644]
man/XtGetSubresources.man [new file with mode: 0644]
man/XtGetSubvalues.man [new file with mode: 0644]
man/XtGetValues.man [new file with mode: 0644]
man/XtGrabButton.man [new file with mode: 0644]
man/XtGrabKey.man [new file with mode: 0644]
man/XtGrabKeyboard.man [new file with mode: 0644]
man/XtGrabPointer.man [new file with mode: 0644]
man/XtHasCallbacks.man [new file with mode: 0644]
man/XtHooksOfDisplay.man [new file with mode: 0644]
man/XtInitialize.man [new file with mode: 0644]
man/XtInitializeWidgetClass.man [new file with mode: 0644]
man/XtInsertEventHandler.man [new file with mode: 0644]
man/XtInsertEventTypeHandler.man [new file with mode: 0644]
man/XtInsertRawEventHandler.man [new file with mode: 0644]
man/XtInstallAccelerators.man [new file with mode: 0644]
man/XtInstallAllAccelerators.man [new file with mode: 0644]
man/XtIsApplicationShell.man [new file with mode: 0644]
man/XtIsComposite.man [new file with mode: 0644]
man/XtIsConstraint.man [new file with mode: 0644]
man/XtIsManaged.man [new file with mode: 0644]
man/XtIsObject.man [new file with mode: 0644]
man/XtIsOverrideShell.man [new file with mode: 0644]
man/XtIsRealized.man [new file with mode: 0644]
man/XtIsRectObj.man [new file with mode: 0644]
man/XtIsSensitive.man [new file with mode: 0644]
man/XtIsSessionShell.man [new file with mode: 0644]
man/XtIsShell.man [new file with mode: 0644]
man/XtIsSubclass.man [new file with mode: 0644]
man/XtIsTopLevelShell.man [new file with mode: 0644]
man/XtIsTransientShell.man [new file with mode: 0644]
man/XtIsVendorShell.man [new file with mode: 0644]
man/XtIsWMShell.man [new file with mode: 0644]
man/XtIsWidget.man [new file with mode: 0644]
man/XtKeysymToKeycodeList.man [new file with mode: 0644]
man/XtLastEventProcessed.man [new file with mode: 0644]
man/XtLastTimestampProcessed.man [new file with mode: 0644]
man/XtMainLoop.man [new file with mode: 0644]
man/XtMakeGeometryRequest.man [new file with mode: 0644]
man/XtMakeResizeRequest.man [new file with mode: 0644]
man/XtMalloc.man [new file with mode: 0644]
man/XtManageChild.man [new file with mode: 0644]
man/XtManageChildren.man [new file with mode: 0644]
man/XtMapWidget.man [new file with mode: 0644]
man/XtMergeArgLists.man [new file with mode: 0644]
man/XtMoveWidget.man [new file with mode: 0644]
man/XtName.man [new file with mode: 0644]
man/XtNameToWidget.man [new file with mode: 0644]
man/XtNew.man [new file with mode: 0644]
man/XtNewString.man [new file with mode: 0644]
man/XtNextEvent.man [new file with mode: 0644]
man/XtNoticeSignal.man [new file with mode: 0644]
man/XtNumber.man [new file with mode: 0644]
man/XtOffset.man [new file with mode: 0644]
man/XtOffsetOf.man [new file with mode: 0644]
man/XtOpenApplication.man [new file with mode: 0644]
man/XtOpenDisplay.man [new file with mode: 0644]
man/XtOverrideTranslations.man [new file with mode: 0644]
man/XtOwnSelection.man [new file with mode: 0644]
man/XtOwnSelectionIncremental.man [new file with mode: 0644]
man/XtParent.man [new file with mode: 0644]
man/XtParseAcceleratorTable.man [new file with mode: 0644]
man/XtParseTranslationTable.man [new file with mode: 0644]
man/XtPeekEvent.man [new file with mode: 0644]
man/XtPending.man [new file with mode: 0644]
man/XtPopdown.man [new file with mode: 0644]
man/XtPopup.man [new file with mode: 0644]
man/XtPopupSpringLoaded.man [new file with mode: 0644]
man/XtProcessEvent.man [new file with mode: 0644]
man/XtProcessLock.man [new file with mode: 0644]
man/XtProcessUnlock.man [new file with mode: 0644]
man/XtQueryGeometry.man [new file with mode: 0644]
man/XtRealizeWidget.man [new file with mode: 0644]
man/XtRealloc.man [new file with mode: 0644]
man/XtRegisterCaseConverter.man [new file with mode: 0644]
man/XtRegisterDrawable.man [new file with mode: 0644]
man/XtRegisterExtensionSelector.man [new file with mode: 0644]
man/XtRegisterGrabAction.man [new file with mode: 0644]
man/XtReleaseGC.man [new file with mode: 0644]
man/XtReleasePropertyAtom.man [new file with mode: 0644]
man/XtRemoveActionHook.man [new file with mode: 0644]
man/XtRemoveAllCallbacks.man [new file with mode: 0644]
man/XtRemoveBlockHook.man [new file with mode: 0644]
man/XtRemoveCallback.man [new file with mode: 0644]
man/XtRemoveCallbacks.man [new file with mode: 0644]
man/XtRemoveEventHandler.man [new file with mode: 0644]
man/XtRemoveEventTypeHandler.man [new file with mode: 0644]
man/XtRemoveGrab.man [new file with mode: 0644]
man/XtRemoveInput.man [new file with mode: 0644]
man/XtRemoveRawEventHandler.man [new file with mode: 0644]
man/XtRemoveSignal.man [new file with mode: 0644]
man/XtRemoveTimeOut.man [new file with mode: 0644]
man/XtRemoveWorkProc.man [new file with mode: 0644]
man/XtReservePropertyAtom.man [new file with mode: 0644]
man/XtResizeWidget.man [new file with mode: 0644]
man/XtResolvePathname.man [new file with mode: 0644]
man/XtScreen.man [new file with mode: 0644]
man/XtScreenDatabase.man [new file with mode: 0644]
man/XtScreenOfObject.man [new file with mode: 0644]
man/XtSendSelectionRequest.man [new file with mode: 0644]
man/XtSessionGetToken.man [new file with mode: 0644]
man/XtSessionReturnToken.man [new file with mode: 0644]
man/XtSetArg.man [new file with mode: 0644]
man/XtSetErrorHandler.man [new file with mode: 0644]
man/XtSetErrorMsgHandler.man [new file with mode: 0644]
man/XtSetEventDispatcher.man [new file with mode: 0644]
man/XtSetKeyTranslator.man [new file with mode: 0644]
man/XtSetKeyboardFocus.man [new file with mode: 0644]
man/XtSetLanguageProc.man [new file with mode: 0644]
man/XtSetMappedWhenManaged.man [new file with mode: 0644]
man/XtSetMultiClickTime.man [new file with mode: 0644]
man/XtSetSelectionParameters.man [new file with mode: 0644]
man/XtSetSelectionTimeout.man [new file with mode: 0644]
man/XtSetSensitive.man [new file with mode: 0644]
man/XtSetSubvalues.man [new file with mode: 0644]
man/XtSetTypeConverter.man [new file with mode: 0644]
man/XtSetValues.man [new file with mode: 0644]
man/XtSetWMColormapWindows.man [new file with mode: 0644]
man/XtSetWarningHandler.man [new file with mode: 0644]
man/XtSetWarningMsgHandler.man [new file with mode: 0644]
man/XtStringConversionWarning.man [new file with mode: 0644]
man/XtSuperclass.man [new file with mode: 0644]
man/XtToolkitInitialize.man [new file with mode: 0644]
man/XtToolkitThreadInitialize.man [new file with mode: 0644]
man/XtTranslateCoords.man [new file with mode: 0644]
man/XtTranslateKeycode.man [new file with mode: 0644]
man/XtUngrabButton.man [new file with mode: 0644]
man/XtUngrabKey.man [new file with mode: 0644]
man/XtUngrabKeyboard.man [new file with mode: 0644]
man/XtUngrabPointer.man [new file with mode: 0644]
man/XtUninstallTranslations.man [new file with mode: 0644]
man/XtUnmanageChild.man [new file with mode: 0644]
man/XtUnmanageChildren.man [new file with mode: 0644]
man/XtUnmapWidget.man [new file with mode: 0644]
man/XtUnrealizeWidget.man [new file with mode: 0644]
man/XtUnregisterDrawable.man [new file with mode: 0644]
man/XtVaAppCreateShell.man [new file with mode: 0644]
man/XtVaAppInitialize.man [new file with mode: 0644]
man/XtVaCreateArgsList.man [new file with mode: 0644]
man/XtVaCreateManagedWidget.man [new file with mode: 0644]
man/XtVaCreatePopupShell.man [new file with mode: 0644]
man/XtVaCreateWidget.man [new file with mode: 0644]
man/XtVaGetApplicationResources.man [new file with mode: 0644]
man/XtVaGetSubresources.man [new file with mode: 0644]
man/XtVaGetSubvalues.man [new file with mode: 0644]
man/XtVaGetValues.man [new file with mode: 0644]
man/XtVaOpenApplication.man [new file with mode: 0644]
man/XtVaSetSubvalues.man [new file with mode: 0644]
man/XtVaSetValues.man [new file with mode: 0644]
man/XtWarning.man [new file with mode: 0644]
man/XtWarningMsg.man [new file with mode: 0644]
man/XtWidgetToApplicationContext.man [new file with mode: 0644]
man/XtWindow.man [new file with mode: 0644]
man/XtWindowOfObject.man [new file with mode: 0644]
man/XtWindowToWidget.man [new file with mode: 0644]
packaging/libXt.spec [new file with mode: 0644]
specs/CH01.xml [new file with mode: 0644]
specs/CH02.xml [new file with mode: 0644]
specs/CH03.xml [new file with mode: 0644]
specs/CH04.xml [new file with mode: 0644]
specs/CH05.xml [new file with mode: 0644]
specs/CH06.xml [new file with mode: 0644]
specs/CH07.xml [new file with mode: 0644]
specs/CH08.xml [new file with mode: 0644]
specs/CH09.xml [new file with mode: 0644]
specs/CH10.xml [new file with mode: 0644]
specs/CH11.xml [new file with mode: 0644]
specs/CH12.xml [new file with mode: 0644]
specs/CH13.xml [new file with mode: 0644]
specs/Makefile.am [new file with mode: 0644]
specs/acknowledgement.xml [new file with mode: 0644]
specs/appA.xml [new file with mode: 0644]
specs/appB.xml [new file with mode: 0644]
specs/appC.xml [new file with mode: 0644]
specs/appD.xml [new file with mode: 0644]
specs/appE.xml [new file with mode: 0644]
specs/appF.xml [new file with mode: 0644]
specs/intrinsics.xml [new file with mode: 0644]
specs/preface.xml [new file with mode: 0644]
src/ActionHook.c [new file with mode: 0644]
src/Alloc.c [new file with mode: 0644]
src/ArgList.c [new file with mode: 0644]
src/Callback.c [new file with mode: 0644]
src/ClickTime.c [new file with mode: 0644]
src/Composite.c [new file with mode: 0644]
src/Constraint.c [new file with mode: 0644]
src/Convert.c [new file with mode: 0644]
src/Converters.c [new file with mode: 0644]
src/Core.c [new file with mode: 0644]
src/Create.c [new file with mode: 0644]
src/Destroy.c [new file with mode: 0644]
src/Display.c [new file with mode: 0644]
src/Error.c [new file with mode: 0644]
src/Event.c [new file with mode: 0644]
src/EventUtil.c [new file with mode: 0644]
src/Functions.c [new file with mode: 0644]
src/GCManager.c [new file with mode: 0644]
src/Geometry.c [new file with mode: 0644]
src/GetActKey.c [new file with mode: 0644]
src/GetResList.c [new file with mode: 0644]
src/GetValues.c [new file with mode: 0644]
src/HookObj.c [new file with mode: 0644]
src/Hooks.c [new file with mode: 0644]
src/Initialize.c [new file with mode: 0644]
src/Intrinsic.c [new file with mode: 0644]
src/Keyboard.c [new file with mode: 0644]
src/Makefile.am [new file with mode: 0644]
src/Manage.c [new file with mode: 0644]
src/NextEvent.c [new file with mode: 0644]
src/Object.c [new file with mode: 0644]
src/PassivGrab.c [new file with mode: 0644]
src/Pointer.c [new file with mode: 0644]
src/Popup.c [new file with mode: 0644]
src/PopupCB.c [new file with mode: 0644]
src/RectObj.c [new file with mode: 0644]
src/ResConfig.c [new file with mode: 0644]
src/Resources.c [new file with mode: 0644]
src/Selection.c [new file with mode: 0644]
src/SetSens.c [new file with mode: 0644]
src/SetValues.c [new file with mode: 0644]
src/SetWMCW.c [new file with mode: 0644]
src/Shell.c [new file with mode: 0644]
src/TMaction.c [new file with mode: 0644]
src/TMgrab.c [new file with mode: 0644]
src/TMkey.c [new file with mode: 0644]
src/TMparse.c [new file with mode: 0644]
src/TMprint.c [new file with mode: 0644]
src/TMstate.c [new file with mode: 0644]
src/Threads.c [new file with mode: 0644]
src/VarCreate.c [new file with mode: 0644]
src/VarGet.c [new file with mode: 0644]
src/Varargs.c [new file with mode: 0644]
src/Vendor.c [new file with mode: 0644]
src/sharedlib.c [new file with mode: 0644]
test/Alloc.c [new file with mode: 0644]
test/Converters.c [new file with mode: 0644]
test/Event.c [new file with mode: 0644]
test/Makefile.am [new file with mode: 0644]
util/Makefile.am [new file with mode: 0644]
util/Shell.ht [new file with mode: 0644]
util/StrDefs.ct [new file with mode: 0644]
util/StrDefs.ht [new file with mode: 0644]
util/makestrs.c [new file with mode: 0644]
util/makestrs.man [new file with mode: 0644]
util/string.list [new file with mode: 0644]
xt.pc.in [new file with mode: 0644]

diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..9e121b1
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,87 @@
+
+Copyright Â© 2001,2003 Keith Packard
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation, and that the name of Keith Packard not be used in
+advertising or publicity pertaining to distribution of the software without
+specific, written prior permission.  Keith Packard makes no
+representations about the suitability of this software for any purpose.  It
+is provided "as is" without express or implied warranty.
+
+KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+
+Copyright (c) 1993, 2011, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+
diff --git a/ChangeLog b/ChangeLog
new file mode 100644 (file)
index 0000000..cf0ab3d
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,1748 @@
+commit 2d689ac861085d1d74bcbd05d1595bac0bf67d20
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Thu Mar 15 22:51:45 2012 -0700
+
+    libXt 1.1.3
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 75bef5b488245467b6638e25cd22006b306e8536
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Mon Mar 12 18:36:52 2012 -0700
+
+    Revert "Treat unexpected returned events from poll as errors"
+    
+    This commit caused regressions:
+    https://bugs.freedesktop.org/show_bug.cgi?id=47203
+    https://bugs.freedesktop.org/show_bug.cgi?id=47216
+    
+    This reverts commit 70bb9e28d37fff4ead4d0a2c672af77059765fa4.
+
+commit 8ab1833a80a18131d897f6d9965545c16acef921
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Wed Mar 7 17:57:26 2012 -0800
+
+    libXt 1.1.2
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit aa0f30641769968e0453a7d02f3f8e5955641336
+Author: Matt Dew <marcoz@osource.org>
+Date:   Mon Jan 16 16:24:32 2012 -0700
+
+    informaltable cleanup
+    
+    On certain tables, add top and bottom borders to table header
+    and a bottom border to the table. This matches what those
+    tables in the old pdfs looked like.
+    
+    the <?dbfo keep-together='always'> prevents tables from
+    splitting across pages. Useful for tiny tables.
+    
+    Converting the colwidth to a floating point, IE, 1* -> 1.0*
+    cleans up these build errors:
+    WARNING: table-layout="fixed" and column-width unspecified =>
+    falling back to proportional-column-width(1)
+    
+    Signed-off-by: Matt Dew <marcoz@osource.org>
+
+commit 70bb9e28d37fff4ead4d0a2c672af77059765fa4
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Wed Jan 4 10:33:29 2012 -0800
+
+    Treat unexpected returned events from poll as errors
+    
+    Inspired by libxcb's f0565e8f06aadf760a9065a97b8cf5ab9cbd18de
+    
+    Resolves https://bugs.freedesktop.org/show_bug.cgi?id=20048
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit 6dd231d37c036d182e789f0af37ee5417792ad4e
+Author: Stephen Turnbull <stephenjturnbull@gmail.com>
+Date:   Wed Jan 4 10:18:29 2012 -0800
+
+    Don't re-enter the WaitLoop if block is set to false
+    
+    See: https://bugs.freedesktop.org/show_bug.cgi?id=20048
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit 0d8ef503e2d51d727a912d6ef3cf017608e45b7f
+Author: Gaetan Nadon <nadon@memsize.(none)>
+Date:   Sat Dec 31 09:03:39 2011 -0500
+
+    Add .gitignore for the newly added DocBook/XML generated files.
+    
+    Signed-off-by: Gaetan Nadon <nadon@memsize.(none)>
+
+commit 9cbf06b9f7b1378ce3424837c979c3241516bf9b
+Author: Gaetan Nadon <nadon@memsize.(none)>
+Date:   Fri Dec 30 17:08:14 2011 -0500
+
+    docbook.am: embed css styles inside the HTML HEAD element
+    
+    Rather than referring to the external xorg.css stylesheet, embed the content
+    of the file in the html output produced. This is accomplished by using
+    version 1.10 of xorg-xhtml.xsl.
+    
+    This makes the whole html docs tree much more relocatable.
+    In addition, it eliminates xorg.css as a runtime file which makes
+    xorg-sgml-doctools a build time only package.
+    
+    Signed-off-by: Gaetan Nadon <nadon@memsize.(none)>
+
+commit 7aa5d801d3b17fc9a1af9d5f6bc0283e3762cca2
+Author: Matt Dew <marcoz@osource.org>
+Date:   Wed Dec 28 21:17:53 2011 -0700
+
+    Remove old files.
+
+commit b8818e1233b75c6bd47a6d2197fabf3a036a2119
+Author: Matt Dew <marcoz@osource.org>
+Date:   Wed Dec 28 20:34:51 2011 -0700
+
+    Initial docbook conversion.
+
+commit fd0da0d44a8501edaac3be7fac9449ad730d8bf4
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Fri Oct 7 19:45:21 2011 -0700
+
+    Add const attributes to TMparse typedefs to fix gcc -Wwrite-strings warnings
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit af9e4b75167c0e31ec02d5ababf204daa12f500d
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Fri Oct 7 19:32:08 2011 -0700
+
+    Add const attributes to slashDotXdefaults to fix gcc -Wwrite-strings warnings
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 682ca8daf29285ef5013751784a7ec98962b7cbb
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Fri Oct 7 19:30:11 2011 -0700
+
+    Make implementation_default_path return const char *
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit d3c2fbcd83ed9ae9b6cc8d765badca7f8d3261b2
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Fri Oct 7 19:23:37 2011 -0700
+
+    Make gravity strings const to fix gcc -Wwrite-strings warnings
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 94ffb37790ce33fdf49d07dd1ade60b6d8376aa7
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Fri Oct 7 19:21:10 2011 -0700
+
+    Convert ISOLatin1 functions to specify args as const char *
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 1f48cadaa88423a012613a0b456ec8795c8c0992
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Fri Oct 7 17:08:07 2011 -0700
+
+    Whitespace changes related to cleaning up previous patch
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit 9e898aa4fd964e888044e2fa2d64089505331f62
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Fri Oct 7 17:01:34 2011 -0700
+
+    Don't pop elements from our array while we're itterating through it.
+    
+    https://bugs.freedesktop.org/show_bug.cgi?id=22543
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit df2008411a5c6a735af2b0fced01df660bb6978a
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Mon Sep 26 15:29:45 2011 -0700
+
+    makestrs: Add const attributes to fix gcc -Wwrite-strings warnings
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 9347b890ba24db41c7cb6c6e76564e4896bc8cac
+Author: Olivier Fourdan <fourdan@xfce.org>
+Date:   Tue Sep 20 16:45:02 2011 -0700
+
+    Bug 40577 - Missing bound checking in FreeSelectionProperty()
+    
+    https://bugs.freedesktop.org/show_bug.cgi?id=40577
+    
+    FreeSelectionProperty() did not check for the count of items in array
+    and relied on a NULL terminated list, which can cause libXt to crash if
+    FreeSelectionProperty() follows a call to GetSelectionProperty() which
+    reallocates the array.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 5691187ced24b16a951e2b8308bcc2b65dd36eee
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Fri Sep 16 22:54:05 2011 -0700
+
+    Strip trailing whitespace
+    
+    Performed with: find * -type f | xargs perl -i -p -e 's{[ \t]+$}{}'
+    git diff -w & git diff -b show no diffs from this change
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 6c0b44caa9b424c7e05327e8ddc9273b87a0f81f
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Sun Oct 2 13:35:26 2011 -0700
+
+    LP64 fix for TypedArgToArg()
+    
+    https://bugs.freedesktop.org/show_bug.cgi?id=12662
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit 2c29b8b71575d73db6b9542b24fa3312a2cf2f86
+Author: Jon TURNEY <jon.turney@dronecode.org.uk>
+Date:   Wed Apr 27 12:32:39 2011 +0100
+
+    Only link with ws2_32 for mingw target
+    
+    For the Cygwin target, we will be using the socket functions provided
+    by the Cygwin DLL, so linking with ws2_32 is unnecessary, even though
+    it may be present.
+    
+    Signed-off-by: Jon TURNEY <jon.turney@dronecode.org.uk>
+    Reviewed-by: Cyril Brulebois <kibi@debian.org
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 4ee8867047eaff3b121478b7199201d669e2c85d
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Tue May 24 14:37:03 2011 -0400
+
+    Update README for documentation reference
+    
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Cyril Brulebois <kibi@debian.org>
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 5e299936489bf3476464f00ebf3ffa3fa893cc23
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Fri Mar 18 19:36:05 2011 -0700
+
+    Add test case for XtCvtIntToPixmap fix in commit 16d9941f3aa38
+    
+    Expanded from original Sun test case for Solaris bug 4163152.
+    Verified that with commit 16d9941f3aa38 reverted, this test case
+    fails on amd64, with it present, this test case passes.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 6fc14afa3fa98503248138f7f6984ee33a9bd889
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Mon Mar 14 19:07:12 2011 -0700
+
+    Add test case for XtAppMainLoop bug 34715
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 4bf003a824577b5a46a59b3b3e91687b530ee48f
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Thu Mar 10 14:23:44 2011 -0800
+
+    Add test framework similar to xserver and use it to test XtAsprintf
+    
+    Only two simple test cases to start with:
+     - compares the results of snprintf of a short string to a static buffer
+       with the new buffer returned by XtAsprintf.
+     - compare the results of using XtAsprintf to replicate a portion of a
+       very long string with the original string.
+    
+    Uses malloc debugging flags for various platforms to try to catch errors
+    with uninitialized memory (such as the recently fixed failure to terminate
+    the string).
+    
+    Requires xorg-macros 1.13 for XORG_ENABLE_UNIT_TESTS and XORG_WITH_GLIB.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 42c611d9f8c80528f6e36ceb0ce245b06e8b1e8e
+Author: Jordan Hayes <jordan@bitway.com>
+Date:   Sun Mar 6 11:35:47 2011 -0800
+
+    Bug 34715: XtAppMainLoop doesn't work without a Display
+    
+    https://bugs.freedesktop.org/show_bug.cgi?id=34715
+    
+    XtAppNextEvent() doesn't return until there's an actual XEvent to be
+    handled; it handles Xt-internal events (inputs, timers, signals)
+    itself, but doesn't return (because of course, those aren't XEvents).
+    Which means that the exit flag doesn't get a chance to break the loop
+    until/unless there's an actual XEvent.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit c16d3cc264c45601f0e59bdd29e438c7c9679721
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Thu Mar 10 10:19:59 2011 +0100
+
+    Bump to 1.1.1
+    
+    Signed-off-by: Julien Cristau <jcristau@debian.org>
+
+commit fe2cf6e2b70e57624aad71f510ff8c6addaae196
+Author: Cyril Brulebois <kibi@debian.org>
+Date:   Tue Mar 8 16:09:49 2011 +0100
+
+    XtAsprintf: Fix memory corruption.
+    
+    Don't write the null terminator to a random place, this can trigger some
+    segfault in XtOpenDisplay() and other annoyances.
+    
+    Debian Bug #617208 <http://bugs.debian.org/617208>
+    
+    Signed-off-by: Cyril Brulebois <kibi@debian.org>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit f6c791b5f318d8805db4cb6c74b1bc2e91d6c15c
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Sun Mar 6 13:43:46 2011 -0500
+
+    man: replace hard coded section number 3Xt with __libmansuffix__ #35050
+    
+    http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=512130
+    
+    The Xt manpages are installed in section 3 (and not 3Xt as upstream
+    would have it). But, internal cross-references (in particular, in the
+    SEE ALSO part) are left alone, and keep pointing at Foo(3Xt).  The
+    result is that they can't be automatically followed from manpage
+    sanitizers such as dwww or emacs.
+    
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 9ccf14fddedc11bd17b3ae30612c6f70f4cd7e14
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Fri Mar 4 16:31:59 2011 -0800
+
+    Don't need to use target-specific CFLAGS for makestrs
+    
+    It's the only thing built in that directory, so we can use AM_CFLAGS
+    and drop the requirement for AM_PROG_CC_C_O in configure.ac
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Gaetan Nadon <memsize@videotron.ca>
+    Tested-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 16d9941f3aa38dde115cbff639e131761c1b36d0
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Fri Mar 4 15:43:43 2011 -0800
+
+    Incorrect cast in XtCvtIntToPixmap could cause bus error on 64-bit machines
+    
+    Originally fixed by Leo Binchy for Sun Bug 4163152 to resolve bus error
+    on VSW5 (XTS) testing on 64-bit SPARC test run on Solaris 7.
+    ( Testcase: XtCvtIntToPixmap, Purpose:  1)
+    
+    Since we're converting from Int to Pixmap, need to access the argument
+    passed in as an int, not a Pixmap, which is consistent with the other
+    IntToXXX converters in this file.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Matt Turner <mattst88@gmail.com>
+
+commit 994443524ade46bad03eea0acbd1410d561c591d
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Fri Mar 4 16:30:58 2011 -0800
+
+    configure: Bump version to 1.1.0 for release
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit c0a233895cc8270ec0ff0bd2abb88d3f6dd524c3
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Fri Mar 4 12:49:48 2011 -0800
+
+    darwin: Don't use poll() when expected to run on darwin10 and prior
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit abf6062715c7d1390e516261a31abde4ed7ea64e
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Wed Feb 2 23:29:46 2011 -0800
+
+    Shell.c: TopLevelSetValues ignores iconic state if shell not yet realized
+    
+    Fix originally created by Leo Binchy for Sun to fix Solaris bug
+    1243761 The XmNiconic resource doesn't work
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit b1eaa18835ec7c3a11e580340625b35c18edf7ca
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Wed Feb 2 23:21:02 2011 -0800
+
+    GetResources: protect against underflow when type conversion fails
+    
+    Fix originally created by Leo Binchy for Sun to fix Solaris bug 1211553:
+     XtVaCreateManagedWidget with list of resources XtVaTypedArg cause core dump
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 21c1cc98d8210a3ce2a4bf62ecee9168fdd99dcb
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Wed Feb 2 22:42:13 2011 -0800
+
+    Remove unused #ifdef UNALIGNED version of Xt macros & functions
+    
+    Trying to outsmart the compiler and libc is a losing battle, but
+    since UNALIGNED was never defined, we weren't even trying.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 19538f2b4553221b35831e13ec70ed9db436dd32
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Wed Feb 2 11:43:44 2011 -0500
+
+    config: comment, minor upgrade, quote and layout configure.ac
+    
+    Group statements per section as per Autoconf standard layout
+    Quote statements where appropriate.
+    Autoconf recommends not using dnl instead of # for comments
+    
+    Use AC_CONFIG_FILES to replace the deprecated AC_OUTPUT with parameters.
+    Add AC_CONFIG_SRCDIR([Makefile.am])
+    
+    This helps automated maintenance and release activities.
+    Details can be found in http://wiki.x.org/wiki/NewModuleGuidelines
+
+commit 7fd1e98987967b23f66da4b18ebf9798a68cd370
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Fri Jan 28 16:07:07 2011 -0500
+
+    config: replace deprecated AC_HELP_STRING with AS_HELP_STRING
+    
+    This silences an Automake warning.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 84e512a94295387bd0625ce619fc8bd381395c71
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Wed Dec 22 10:49:42 2010 -0800
+
+    Convert ALLOCATE_LOCAL + sprintf to XtAsprintf
+    
+    Now that we don't need to separately strlen the format string, put it
+    directly into the function call to clear gcc warnings of:
+    Initialize.c:397: warning: format not a string literal, argument types not checked
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit c80650fddec8596ef7278e37aa12ce2076c54e93
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Thu Dec 9 23:36:31 2010 -0800
+
+    Convert ResConfig.c to use XtAsprintf() instead of XtMalloc + sprintf
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit ac07da253415ccb8b6322feedf7969967357050e
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Wed Jan 12 23:09:29 2011 -0800
+
+    Add XtAsprintf() as a new exported API
+    
+    Like asprintf() but using XtMalloc() to tie into the Xt memory allocation
+    and error handling subsystems.
+    
+    Bumps libXt version to 1.0.99.1 so that modules can set their pkg-config
+    dependency to libXt >= 1.0.99.1 to require XtAsprintf().
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 84f73c49db8071c06f27609ce7cc7a32a17351a9
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Thu Dec 9 23:44:42 2010 -0800
+
+    Convert some sprintf calls to snprintf
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Julien Cristau <jcristau@debian.org>
+
+commit 14145f3e87a039640cd8bdb2e2f4f30ca9b2a710
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Sun Dec 5 01:21:06 2010 -0800
+
+    config: AC_PROG_CC is provided by XORG_DEFAULT_OPTIONS now
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit a73b8f06b95216083c8335fad45dd0de7f44a529
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Sun Dec 5 01:19:10 2010 -0800
+
+    config: replace deprecated AM_CONFIG_HEADER with AC_CONFIG_HEADERS
+    
+    Regroup AC statements under the Autoconf initialization section.
+    Regroup AM statements under the Automake initialization section.
+    Add missing AC_CONFIG_SRCDIR
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 2bf988d229d2b85208cc42094ce7202204d628af
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Sun Dec 5 00:33:44 2010 -0800
+
+    Remove ancient #if defined(macII) hack for A/UX from makestrs.c
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 96508e1b9da790d4b824a42246d1e86379101733
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Sun Dec 5 00:19:30 2010 -0800
+
+    Remove non-USE_SNPRINTF case from src/Error.c
+    
+    unifdef -DUSE_SNPRINTF src/Error.c
+    Plus manual removal of old #ifdef notyet section that said not enough
+    platforms had snprintf support yet.   Welcome to the new millenium!
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 0b780f8cc8bc2606fc3173628c4d3065aae190f8
+Author: walter harms <wharms@bfs.de>
+Date:   Sun Nov 7 18:51:19 2010 +0100
+
+    remove strcmp in src/ResConfig.c
+    
+    Make remainder check like in the rest of code and replace strcmp()
+    
+    Signed-off-by: walter harms <wharms@bfs.de>
+    Reviewed-by: Mikhail Gusarov <dottedmag@dottedmag.net>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 59598f20ba160fd92abcf88a30f0008425e7b1ec
+Author: walter harms <wharms@bfs.de>
+Date:   Tue Oct 26 13:46:32 2010 +0200
+
+    QueryEventMask: fix NULL check
+    
+    _XtGetPerWidgetInput may return NULL
+    avoid possible NULL references
+    
+    Signed-off-by: walter harms <wharms@bfs.de>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 8572cba2b9094dcd8ee5b4c5bcf3c38f1f291918
+Author: walter harms <wharms@bfs.de>
+Date:   Sat Oct 30 10:47:23 2010 +0200
+
+    src/Resource.c: Fix possible NULL access
+    
+    Signed-off-by: walter harms <wharms@bfs.de>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 6c75b449f6436b787247e164bee03691af2a4f55
+Author: walter harms <wharms@bfs.de>
+Date:   Fri Oct 29 17:24:48 2010 +0200
+
+    XtFree() can handle NULL , remove check
+    
+    Signed-off-by: walter harms <wharms@bfs.de>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 0d29ca61b94cd34b04c5eedae443620a616d01c3
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Thu Oct 28 12:03:25 2010 -0700
+
+    libXt 1.0.9
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 87d019acc715c5ab4a5b2431ec882a0f84946c20
+Author: Jesse Adkins <jesserayadkins@gmail.com>
+Date:   Tue Sep 28 13:30:03 2010 -0700
+
+    Purge cvs tags.
+    
+    Signed-off-by: Jesse Adkins <jesserayadkins@gmail.com>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit aa70c813f6eac2cad2944a98a1a444ea69dc024f
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Tue Oct 5 09:07:30 2010 -0400
+
+    makestrs: Use MAN_SUBST now supplied in XORG_MANPAGE_SECTIONS
+    
+    The value of MAN_SUBST is the same for all X.Org packages.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 9d80fae6bc2cff26f320ff5b7b2ca7333ab3d677
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Tue Oct 5 09:04:19 2010 -0400
+
+    makestrs: Use $(SED) from AC_PROG_SED supplied by XORG_DEFAULT_OPTIONS
+    
+    Use the appropriate platform version of sed
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 71a7e999a4d99aa54ea7268b928d87e27cea6279
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Tue Oct 5 09:02:41 2010 -0400
+
+    makestrs: remove unsed $(appman_DATA)
+    
+    Man page is not installed, this variable is not defined.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 0c968d108d8575db0149922b8375533fc54d0b7a
+Author: walter harms <wharms@bfs.de>
+Date:   Fri Oct 1 15:13:43 2010 +0200
+
+    Honor that GetClassActions() may return NULL.
+    
+    Signed-off-by: Walter <wharms@bfs.de>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 6e4dbf06d4d049666cf81207d9f853a0a40c71b7
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Thu Sep 23 18:27:46 2010 -0700
+
+    Sun's copyrights belong to Oracle now
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 94680a56a32ada91f07db34e02a526dca5ecbbf4
+Author: Ryan Hajdaj <rhajdaj@gotnothin.com>
+Date:   Thu Sep 23 18:13:28 2010 -0700
+
+    Bug 1478: Selection.c damages user error handler function
+    
+    https://bugs.freedesktop.org/show_bug.cgi?id=1478
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit d53a3deb52100596bef9fb7b6c6e7ba15ed18bda
+Author: walter harms <wharms@bfs.de>
+Date:   Wed Sep 22 19:25:20 2010 +0200
+
+    fix dereference in TMprint.c
+    
+    the current codes checks for
+     eventWidget == NULL after accessing
+    eventWidget->core.tm.proc_table
+    
+    now it checks for eventWidget before access eventWidget->core.tm.proc_table.
+    
+    Signed-off-by: walter harms <wharms@bfs.de>
+    Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 47e73791d4a88e59a797e9dde1ab2d5f58ff774c
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Tue Aug 17 10:17:57 2010 -0400
+
+    man: whitespace management
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 8c307c168c724368be2b9e784365b40d4b001aa3
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Tue Aug 17 09:21:36 2010 -0400
+
+    man: store shadow man pages in git rather than generating them
+    
+    Simplify the build process and the makefile.
+    
+    Local fix in CVS for bug 5628 is not required
+    as the problem has been fixed in
+    util-macros d9062e4077ebfd0985baf8418f3d0f111b9ddbba
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 198ac897c7136425a20011a6c99f80cb925d622b
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Fri Aug 6 12:32:10 2010 -0400
+
+    man: using the C preprocessor is not required for man pages.
+    
+    There were no special symbols needing cpp.
+    Everything can be handled by the default MAN_SUBSTS in util-macros.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 74cb722a974010fa3c82dc57a036f97768b3695b
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Tue Jun 8 20:26:29 2010 -0700
+
+    Move Xt specs from xorg-docs module
+    
+    For now, just checked in and included in dist tarballs, not processed
+    into a usable format - same as it was in xorg-docs
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 56621d3ec521dd30fabb1a77ad1c396baa740569
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Tue May 18 18:21:32 2010 -0700
+
+    Move sm from Requires to Requires.private in xt.pc
+    
+    As explained in https://bugs.freedesktop.org/show_bug.cgi?id=26943
+    since libXt callers need the SM headers but don't necessarily need to
+    link directly to libSM, it should be in Requires.private, not Requires.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Adam Jackson <ajax@redhat.com>
+
+commit f3d2ac478918b99c51e0b4bff97935f2255ab537
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Fri Apr 16 16:08:39 2010 -0700
+
+    Bug 26943: wrong dependencies in xt.pc.in
+    
+    https://bugs.freedesktop.org/show_bug.cgi?id=26943
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 723d78fe8e159dee1281f3e4f8dc03825aa334b6
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Thu Apr 1 20:30:43 2010 -0400
+
+    config: update and relocate AX_DEFINE_DIR macro
+    
+    Remove deprecated acinclude.m4 macro container file
+    Use separate macro files as per autoconf recommendation
+    Use the latest macro from GNU
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 99a1c1f2cfa595500704d54e223f1c9e0ff9a10e
+Author: Yaakov Selkowitz <yselkowitz@users.sourceforge.net>
+Date:   Fri Apr 2 01:43:22 2010 -0500
+
+    Use automake silent rules for BUILT_SOURCES generation
+    
+    Signed-off-by: Yaakov Selkowitz <yselkowitz@users.sourceforge.net>
+    Acked-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit cf3198fdc302bb017e6cc8014abc3bdbfeb9f6b1
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Mon Mar 29 16:50:34 2010 -0400
+
+    config: update AC_PREREQ statement to 2.60
+    
+    Unrelated to the previous patches, the new value simply reflects
+    the reality that the minimum level for autoconf to configure
+    all x.org modules is 2.60 dated June 2006.
+    
+    ftp://ftp.gnu.org/gnu/autoconf/autoconf-2.60.tar.gz
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 5a876831762c5d22101bd2fa71203647858f66b2
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Mon Mar 29 14:53:49 2010 -0400
+
+    config: remove the pkgconfig pc.in file from EXTRA_DIST
+    
+    Automake always includes it in the tarball.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit cba12c108da0c3eb868a5cb08f641b6d036e0d05
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Sat Mar 27 16:30:02 2010 -0400
+
+    config: remove execute permission on configureation file
+    
+    Introduced in commit 6baea764567c3327f1d85ba91375adaea6dab46d
+    "Link with winsock for WIN32 platforms"
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit e3bce11a8ea7e0175a6f08367bace9b0eb2b898a
+Author: Rémi Cardona <remi@gentoo.org>
+Date:   Mon Mar 15 22:59:04 2010 +0100
+
+    libXt 1.0.8
+    
+    Signed-off-by: Rémi Cardona <remi@gentoo.org>
+
+commit a1a8df535fa5ab3748404bdeb07e61beb604b14e
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Thu Jan 14 20:07:46 2010 -0800
+
+    Update Sun license notices to current X.Org standard form
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 6393306d1a2eb8239f108a773f342495e1cfd85c
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Thu Jan 14 15:57:31 2010 -0500
+
+    COPYING: add missing copyright notices
+    
+    Refer to: ActionHook.c
+    Copyright 1987, 1988 by Digital Equipment Corporation
+    Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+    Copyright 1987, 1988, 1998  The Open Group
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit b798093fc6cbcf35c095f3401586d2741adcd2cd
+Author: Jeremy Huddleston <jeremyhu@freedesktop.org>
+Date:   Fri Dec 11 17:04:23 2009 -0800
+
+    darwin: xnu doesn't support poll on ttys on the master side.
+    
+    <rdar://problem/7360546>
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@freedesktop.org>
+
+commit e0ac2ea8b211bdca848679ee59362384f0f97e36
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Mon Dec 7 22:28:53 2009 -0800
+
+    Fix make distcheck (./util/makestrs.1 left after distclean)
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 345633dc9c79b32a1b391dfb4dfedf87ae9e291b
+Author: Rémi Cardona <remi@gentoo.org>
+Date:   Mon Nov 9 12:26:17 2009 +0100
+
+    Don't install makestrs on the system
+    
+    It has no known outside-libXt users. Let's not install it and its man page.
+    
+    Signed-off-by: Rémi Cardona <remi@gentoo.org>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit ed31677bb9b1dd9498715a922763968917b87e49
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Fri Nov 27 20:56:04 2009 -0500
+
+    Makefile.am: add ChangeLog and INSTALL on MAINTAINERCLEANFILES
+    
+    Now that the INSTALL file is generated.
+    Allows running make maintainer-clean.
+
+commit 2d95ad4beed294a0a30fdb1d8e7798fa62455a41
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Wed Oct 28 14:09:10 2009 -0400
+
+    INSTALL, NEWS, README or AUTHORS files are missing/incorrect #24206
+    
+    Add missing INSTALL file. Use standard GNU file on building tarball
+    README may have been updated
+    Remove AUTHORS file as it is empty and no content available yet.
+    Remove NEWS file as it is empty and no content available yet.
+
+commit 7cc872e9934f62bf56976d5592ce621e30b1f95a
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Tue Oct 27 15:07:26 2009 -0400
+
+    Deploy the new XORG_DEFAULT_OPTIONS #24242
+    
+    This macro aggregate a number of existing macros that sets commmon
+    X.Org components configuration options. It shields the configuration file from
+    future changes.
+
+commit 7ba57d7789362c2c2e646cc3b896802e6cbcb039
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Mon Oct 26 22:08:43 2009 -0400
+
+    Makefile.am: ChangeLog not required: EXTRA_DIST or *CLEANFILES #24432
+    
+    ChangeLog filename is known to Automake and requires no further
+    coding in the makefile.
+
+commit b4309cadb1de581d191fce924dac8fc7e55e5fb8
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Thu Oct 22 12:34:19 2009 -0400
+
+    .gitignore: use common defaults with custom section # 24239
+    
+    Using common defaults will reduce errors and maintenance.
+    Only the very small or inexistent custom section need periodic maintenance
+    when the structure of the component changes. Do not edit defaults.
+
+commit 80ff1f362eefabe4be62784b001500b49943f1a5
+Author: Jeremy Huddleston <jeremyhu@freedesktop.org>
+Date:   Wed Oct 21 12:47:26 2009 -0700
+
+    This is not a GNU project, so declare it foreign.
+    
+    On Wed, 2009-10-21 at 13:36 +1000, Peter Hutterer wrote:
+    > On Tue, Oct 20, 2009 at 08:23:55PM -0700, Jeremy Huddleston wrote:
+    > > I noticed an INSTALL file in xlsclients and libXvMC today, and it
+    > > was quite annoying to work around since 'autoreconf -fvi' replaces
+    > > it and git wants to commit it.  Should these files even be in git?
+    > > Can I nuke them for the betterment of humanity and since they get
+    > > created by autoreconf anyways?
+    >
+    > See https://bugs.freedesktop.org/show_bug.cgi?id=24206
+    
+    As an interim measure, replace AM_INIT_AUTOMAKE([dist-bzip2]) with
+    AM_INIT_AUTOMAKE([foreign dist-bzip2]). This will prevent the generation
+    of the INSTALL file. It is also part of the 24206 solution.
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@freedesktop.org>
+
+commit 5d63df924d7f66d2207c8db67e5d6cce8c7b245b
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Thu Oct 8 21:50:35 2009 -0700
+
+    libXt 1.0.7
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit f82769a1a75e17f66b67a5f71dcf889955569a57
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Thu Oct 8 21:33:27 2009 -0700
+
+    Replace AC_DEFINE_DIR with AX_DEFINE_DIR from Autoconf Archive
+
+commit 0ce97e4422409de070af7fd70da590db12c58579
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Tue Oct 6 16:12:03 2009 -0700
+
+    Migrate to xorg macros 1.3 & XORG_DEFAULT_OPTIONS
+    
+    Includes adding many $(AM_V_GEN) calls for the AM_SILENT_RULES included
+    by XORG_DEFAULT_OPTIONS when automake-1.11 or newer is used
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 254e2e0a8197e47bcef3e3c0b461ef8156a1af64
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Tue Oct 6 16:29:59 2009 -0700
+
+    Use make rules instead of shell for loops to generate shadow man pages
+    
+    Allows parallel make and simpler build logs/error reporting
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit fedc095da647b6f4fda8ca5edc5644458e2b2fbf
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Tue Aug 25 18:31:49 2009 +0200
+
+    Link against libICE
+    
+    libXt uses IceConnectionNumber() and IceProcessMessages(), so make sure
+    we link against -lICE.
+    
+    Signed-off-by: Julien Cristau <jcristau@debian.org>
+
+commit f77482f0618f954de1d080599ada058e9a3c24ff
+Author: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+Date:   Tue Jul 28 11:59:41 2009 +0200
+
+    Fix compilation of host tools in cross-compilation case
+    
+    At 36e9f0d351afbf7fd2595990b2d39e7c551f6420, a fix was added to use
+    the host gcc instead of the target gcc when cross-compiling
+    libXt. This fix works, but is not solve the whole problem: the CFLAGS
+    and LDFLAGS used with the host compilers are the one defined for the
+    target compiler (and the flags for both compilers might be very
+    different).
+    
+    This new fix let libXt obey to CFLAGS_FOR_BUILD and LDFLAGS_FOR_BUILD
+    environment variables, and use them to compile the host tools in
+    util/.
+    
+    Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+
+commit 369629611609f20c89499c1f6b5562a4f3cca983
+Author: Adam Jackson <ajax@redhat.com>
+Date:   Thu Jul 2 13:28:01 2009 -0400
+
+    libXt 1.0.6
+
+commit 28677468c56888b18c44d71a62903d23e5c294cf
+Author: Jon TURNEY <jon.turney@dronecode.org.uk>
+Date:   Tue May 19 23:25:15 2009 +0100
+
+    Cygwin/X: Build fix
+    
+    Commit c59dd27ecb1751f0b097046b2f892028e5a10a3e replaces __CYGWIN__ with WIN32
+    in a preprocessor check, as the code is appropriate for both Cygwin and Mingw.
+    
+    But this isn't quite the right was to do this. Being a Win32 platform is
+    Cygwin's secret shame, and WIN32 isn't actually defined to avoid turning on
+    code specific to native-Win API ports
+    
+    (See http://www.cygwin.com/faq/faq.programming.html#faq.programming.preprocessor)
+    
+    Yes, this probably means WIN32 could bereplaced by __MINGW32__ everywhere in the
+    X sources...
+
+commit 535f8c5324205b92c15e8755008c33a2766832c8
+Author: John McKernan <john.mckernan@sun.com>
+Date:   Fri May 1 13:53:03 2009 -0700
+
+    Sun bug 4010369: Too slow to process Keycode 0 events in Xt Translation Mgr.
+    
+    Evaluation from original bug report against Solaris 2.6 in 1996:
+    
+        According to my investigation with the problem using debuggable
+        libXt and libXm, keycode 0 keypress events, which are given to
+        Xt's Translation Manager when inputting any cyrillic/greek characters,
+        are not cached in Xt's Translation Manager. At the TRANSLATE macro
+        in the Xt's source lib/Xt/TMkey.c, keycode 0 keyevents are always
+        given to XtTranslateKeycode() and it consumes a long time to parse
+        Motif's Translation Manager tables as many times as keycode 0
+        keyevent are given.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 061d3eebf7a0502afcd9c1831d67c8961feece8d
+Author: John McKernan <john.mckernan@sun.com>
+Date:   Fri May 1 13:41:26 2009 -0700
+
+    Sun bug #1237023:  Dtterm crashes in XtDisplayAccelerators()
+    
+    Don't try to printf if returned string is NULL
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit e500631954c8d390e8705fde7f50d1acc006406e
+Author: Jeremy Huddleston <jeremy@yuffie.local>
+Date:   Thu Mar 12 01:03:39 2009 -0700
+
+    darwin: Don't use poll() on versions of darwin before darwin10
+
+commit 81792a4cb402c4e5275d63465bc5d65599e34a25
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Mon Feb 2 20:34:36 2009 -0800
+
+    Add README with pointers to mailing list, bugzilla & git repos
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit f56a69f2cf7df1e7cdf2494c5408786e53467374
+Author: Paulo Cesar Pereira de Andrade <pcpa@mandriva.com.br>
+Date:   Fri Jan 30 18:22:10 2009 -0200
+
+    Janitor: ansification, make distcheck, compiler warnings, .gitignore.
+    
+      Most "compiler" warnings were actually sparse warnings, due to
+    assigning a integer to a pointer, or an external symbol without
+    a previous declaration.
+
+commit c1f227f94aec6f4555182965fc0d2d8f33fef01f
+Author: Peter Breitenlohner <peb@mppmu.mpg.de>
+Date:   Mon Oct 20 18:50:37 2008 -0700
+
+    X.Org Bug 17942: libXt manpage formatting
+    
+    <http://bugs.freedesktop.org/show_bug.cgi?id=17942>
+
+commit f488a6a218da6b543d1495e607ff1b31b0b48900
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Tue Sep 23 19:14:09 2008 +0300
+
+    configure.ac: Minor thinko
+
+commit 36e9f0d351afbf7fd2595990b2d39e7c551f6420
+Author: John Tapsell <johnflux@gmail.com>
+Date:   Tue Sep 23 19:00:42 2008 +0300
+
+    configure.ac: Use native compiler for build tools
+    
+    makestrs is used during the build, so use the native compiler (either
+    gcc or cc in $PATH, can be overridden as $CC_FOR_BUILD) instead of the
+    (possibly cross-) compiler.
+
+commit ace1676b0630dfe739c3bd712ed2b6e46bdb52f1
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Mon Jun 23 20:04:29 2008 -0700
+
+    Update ac_define_dir.m4 to 2008-04-12 version
+
+commit 556918e21fbb67131d979b04f29a0b59fcd87575
+Author: Alan Hourihane <alanh@tungstengraphics.com>
+Date:   Wed Apr 30 19:15:14 2008 +0100
+
+    Set a blank default search path for WIN32
+
+commit 56444103a3b2159d334aa87d782fbca987118bbc
+Author: Alan Hourihane <alanh@tungstengraphics.com>
+Date:   Tue Apr 29 22:44:54 2008 +0100
+
+    less speed, more haste
+
+commit a393450cbde80b6e7f0e1c4112363eb1313a6cdb
+Author: Alan Hourihane <alanh@tungstengraphics.com>
+Date:   Tue Apr 29 22:16:05 2008 +0100
+
+    fix logic inverted problem
+
+commit cd83cf47412b4a5979e152990c3b0870751aee07
+Author: Colin Harrison <colin.harrison-at-virgin.net>
+Date:   Tue Apr 29 19:45:50 2008 +0100
+
+    Reduce the path searches on mingw
+
+commit bb6d2a09b87560ae396085ef0981b700924333cd
+Author: Colin Harrison <colin.harrison-at-virgin.net>
+Date:   Tue Apr 29 13:45:06 2008 +0100
+
+    Xming specific configuration file settings
+
+commit 6baea764567c3327f1d85ba91375adaea6dab46d
+Author: Alan Hourihane <alanh@tungstengraphics.com>
+Date:   Tue Apr 29 10:22:35 2008 +0100
+
+    Link with winsock for WIN32 platforms
+
+commit c59dd27ecb1751f0b097046b2f892028e5a10a3e
+Author: Colin Harrison <colin.harrison-at-virgin.net>
+Date:   Tue Apr 29 10:19:55 2008 +0100
+
+    Fix some build issues for Win32 platforms
+
+commit 8e95cb765e88d36c35f868f650c86c62c31ad635
+Author: Colin Harrison <colin.harrison-at-virgin.net>
+Date:   Wed Apr 23 13:56:28 2008 +0100
+
+    Add __MINGW32__
+
+commit 4b64b821a48fe493056271216dbe29d43376954b
+Author: Matthieu Herrb <matthieu.herrb@laas.fr>
+Date:   Sun Mar 9 08:42:48 2008 +0100
+
+    nuke RCS Ids
+
+commit b648ed992d2c3ea8a7462a595e51a07085bf4688
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Fri Mar 7 15:52:27 2008 -0800
+
+    Solaris builds need to pass -intelabi to makestrs, even on SPARC
+    
+    For some reason, when Solaris moved to X11R6.0, the intelabi version
+    of StringDefs.c/.h was used on SPARC, so now we're stuck with 10+ years
+    of binaries built to use it.
+
+commit c044ea620446db676ee076484fed3268c4d7c695
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Thu Dec 6 15:51:20 2007 -0500
+
+    Add missing PHONY line for automatic ChangeLog generation
+
+commit 6b483e355de6c5ee5dc635ab9b817bf72680b016
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Sat Jun 23 15:20:09 2007 +0100
+
+    Allow C++ apps to build using libXt
+
+commit 845e51c740574db2f72a5e7c5462d8f56a3c4e22
+Author: Andreas Luik <luik@orthogon.com>
+Date:   Sun Apr 8 00:43:56 2007 +0300
+
+    Recalculate fd_set more aggressively (bug #808)
+    
+    select() can modify the fd set, so be a bit pessimistic and recalculate
+    it more often.
+
+commit 007d9e5f8b2edc3ff8ce8b2f96b8f56a417bb78d
+Author: Matthieu Herrb <matthieu.herrb@laas.fr>
+Date:   Mon Feb 26 18:27:43 2007 +0100
+
+    Sync XtGetErrorDatabaseText() prototype with reality.
+
+commit 4e7031510d05471e77ff48355b23fc8e4302648c
+Author: Ben Byer <bbyer@bbyer.(none)>
+Date:   Tue Feb 20 01:05:27 2007 -0800
+
+    added -flat_namespace to CFLAGS for Darwin
+
+commit 92452ca7a51fa77ea60eacd320dbd970e32653c9
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Sat Jan 27 22:29:03 2007 -0800
+
+    Version bump: 1.0.5
+
+commit a5c7d56278e569257d3d64ff7681d0a484a1f817
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Sat Jan 27 22:26:55 2007 -0800
+
+    Replace static ChangeLog with dist-hook to generate from git log
+
+commit 67772a3f39c5e8c4019336b0bf4d32e70726b0c0
+Author: Eric S. Raymond <esr@thyrsus.com>
+Date:   Tue Jan 2 17:49:17 2007 -0800
+
+    Bug 9514: Markup error in makestrs.1x man page
+    
+    <https://bugs.freedesktop.org/show_bug.cgi?id=9514>
+
+commit 75f83503ba1db628137ffc9d1d9e4f2a7a2fd97a
+Merge: 2f201b1 153264a
+Author: Jeremy C. Reed <reed@glacier.reedmedia.net>
+Date:   Sat Dec 9 09:31:02 2006 -0600
+
+    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/lib/libXt
+
+commit 2f201b177816be7112884bda180d65f5fff19155
+Author: Jeremy C. Reed <reed@glacier.reedmedia.net>
+Date:   Sat Dec 9 09:28:04 2006 -0600
+
+    Don't use "INSTALL" during the build because INSTALL may be set by
+    build environment with settings for chown and make not work with
+    permissions of the builder.  So use mkdir -p and cp instead.  This
+    is for my bug #6599.
+
+commit 153264a7f290f98e01ed2dbd7265c977ec8ba7e1
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Wed Nov 8 16:16:02 2006 +0200
+
+    bump to 1.0.4
+
+commit 0c1954765c32c1bd298111cc6bed2f090494c0cf
+Author: Eric Anholt <eric@anholt.net>
+Date:   Fri Oct 27 12:35:38 2006 -0700
+
+    Fix .pc file with new autotools by using AC_DEFINE_DIR.
+    
+    With autoconf 2.60, $datadir now expands to use $datarootdir rather than just
+    $prefix, so the .pc referenced the undefined $datarootdir.  AC_DEFINE_DIR
+    expands it all out for us.
+
+commit 3c166cc1efe86ca42180a64e14b6bbbc9744bc82
+Author: Eric Anholt <eric@anholt.net>
+Date:   Fri Oct 27 12:30:09 2006 -0700
+
+    Add more generated files to ignore.
+
+commit 8d18dfa21f8349c998675e1f9971de02ca99a1cd
+Author: Adam Jackson <ajax@benzedrine.nwnk.net>
+Date:   Fri Oct 13 16:32:28 2006 -0400
+
+    Bump to 1.0.3
+
+commit b54d069ea397486c6125943ffdb813482383576a
+Author: Qiu-Yuan (Kathleen) Yang <qiu-yuan.yang@sun.com>
+Date:   Fri Sep 1 18:04:26 2006 -0700
+
+    Sun bug #4962001: Close memory leaks seen in Motif apps
+    
+    The function "GetResources" will return a copy of resources to the caller
+    and the caller has the responsibility to free the returned copy.  However some
+    functions, such as "XtGetSubresources", "_XtGetResources", and
+    "XtGetApplicationResources" invoked "GetResources" without freeing the
+    returned resource copy.
+
+commit 6e48adfab0c020ab5d55b68f9b4cc63ed5d8b14c
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Fri Sep 1 17:59:42 2006 -0700
+
+    Add *~ to .gitignore to skip over emacs droppings
+
+commit 1eeeff85bf9f293de875169f6dc54577de0443f1
+Author: David Nusinow <dnusinow@debian.org>
+Date:   Wed Aug 30 16:33:10 2006 -0400
+
+    Generate the internal manpage section using __libmansuffix__
+
+commit e2f43888fe021aac27770afa6a64fb3cf3fab190
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Thu Jul 13 14:59:08 2006 -0700
+
+    renamed: .cvsignore -> .gitignore
+
+commit 3d3a1bc23f571daa7a876a21169d5a0c996ce7cc
+Author: Adam Jackson <ajax@nwnk.net>
+Date:   Fri May 12 16:10:27 2006 +0000
+
+    Bump to 1.0.2
+
+commit fc82234c73362d6f07acf2dcf72bcefd96850105
+Author: Matthieu Herrb <matthieu.herrb@laas.fr>
+Date:   Sun Apr 30 14:30:16 2006 +0000
+
+    Fix ERRORDB definition for the case where ${prefix} != /usr
+
+commit bc813392aa8f563e6cd385636b90a7496fcaa14e
+Author: Adam Jackson <ajax@nwnk.net>
+Date:   Thu Apr 27 00:23:17 2006 +0000
+
+    Bump to 1.0.1
+
+commit 1c55684a7411c35fce2a958d84be4c13b5349ea0
+Author: Alan Coopersmith <Alan.Coopersmith@sun.com>
+Date:   Sun Feb 12 18:19:22 2006 +0000
+
+    Bug #5628 <https://bugs.freedesktop.org/show_bug.cgi?id=5628> Shadow pages
+        not created correctly when MANDIR & MANSUFFIX don't match.
+
+commit 6851a1faf46a4d8a85e481162c8ee84f66174f89
+Author: Kevin E Martin <kem@kem.org>
+Date:   Thu Dec 15 00:24:34 2005 +0000
+
+    Update package version number for final X11R7 release candidate.
+
+commit b9464aa563b650faefbb881d5b399659aa8c30bb
+Author: Kevin E Martin <kem@kem.org>
+Date:   Sat Dec 10 16:29:07 2005 +0000
+
+    Add configure option to install makestrs and its manpage.
+    Add makestrs man page.
+
+commit 6be3ca4fb0d0f9a1361d45dfc094f0a7a85b27b4
+Author: Kevin E Martin <kem@kem.org>
+Date:   Wed Dec 7 16:17:08 2005 +0000
+
+    Add configure option to set the build's app-default dir, and put the result
+        in the xt.pc file for applications to use.
+
+commit 3186014010acbda9f8e3568a1e8076130212f600
+Author: Kevin E Martin <kem@kem.org>
+Date:   Tue Dec 6 22:48:44 2005 +0000
+
+    Change *man_SOURCES ==> *man_PRE to fix autotools warnings.
+
+commit 5801485b720e1dd3799737d9f127212afd3101c7
+Author: Kevin E Martin <kem@kem.org>
+Date:   Sat Dec 3 05:49:45 2005 +0000
+
+    Update package version number for X11R7 RC3 release.
+
+commit d480f9dbd3e07b4e139f2a1422f803e6e6264854
+Author: Kevin E Martin <kem@kem.org>
+Date:   Sat Dec 3 04:41:50 2005 +0000
+
+    Add check and cflags for malloc(0) returning NULL.
+
+commit 2a591fe7b3416d8609bd71cb068f9390105ffecf
+Author: Alan Coopersmith <Alan.Coopersmith@sun.com>
+Date:   Mon Nov 28 22:03:06 2005 +0000
+
+    Change *mandir targets to use new *_MAN_DIR variables set by xorg-macros.m4
+        update to fix bug #5167 (Linux prefers *.1x man pages in man1 subdir)
+
+commit 7a8979367e4ab1a6412fef9a027b7d38621d87b7
+Author: Alan Coopersmith <Alan.Coopersmith@sun.com>
+Date:   Wed Nov 23 22:33:07 2005 +0000
+
+    Bug #5003 <https://bugs.freedesktop.org/show_bug.cgi?id=5003> Patch #3763
+        <https://bugs.freedesktop.org/attachment.cgi?id=3763> Xorg code misuses
+        S_IF* macros
+
+commit 2533120c26185990d326fa14c92383f85239f3b7
+Author: Kevin E Martin <kem@kem.org>
+Date:   Sat Nov 19 07:15:43 2005 +0000
+
+    Update pkgconfig files to separate library build-time dependencies from
+        application build-time dependencies, and update package deps to work
+        with separate build roots.
+
+commit 3f332f9af360cd42f5ff1b6f16ac64f7d146ff34
+Author: Kevin E Martin <kem@kem.org>
+Date:   Wed Nov 9 21:19:13 2005 +0000
+
+    Update package version number for X11R7 RC2 release.
+
+commit f151f6dfa14c36cfa54ab3e55bb67f24a8a39dc6
+Author: Kean Johnson <kean@armory.com>
+Date:   Tue Nov 8 06:33:25 2005 +0000
+
+    See ChangeLog entry 2005-11-07 for details.
+
+commit 7ed0ec3136190288b0c450cdf2998000c43619df
+Author: Kevin E Martin <kem@kem.org>
+Date:   Tue Nov 1 15:11:51 2005 +0000
+
+    Update pkgcheck dependencies to work with separate build roots.
+
+commit 33b861860b86b53840007010287f5483a503c8e9
+Author: Kevin E Martin <kem@kem.org>
+Date:   Wed Oct 19 02:48:11 2005 +0000
+
+    Update package version number for RC1 release.
+
+commit d3853ab17d7203e7fbdfcd5cc8ed3505e5aa6233
+Author: Kevin E Martin <kem@kem.org>
+Date:   Tue Oct 18 07:24:03 2005 +0000
+
+    Use $(INSTALL) instead of $(install_sh_DATA) for creating directories.
+
+commit 831a32df90d6b3db66d6c578f6e231d4aab2b760
+Author: Adam Jackson <ajax@nwnk.net>
+Date:   Tue Oct 18 03:10:14 2005 +0000
+
+    Split the 'install -d' over multiple lines so certain lame versions of
+        autotools don't flip out.
+
+commit 5e37faddaac8ac50ee4ca719975f9bf526e4c980
+Author: Alan Coopersmith <Alan.Coopersmith@sun.com>
+Date:   Tue Oct 18 01:50:02 2005 +0000
+
+    Add --with-xfile-search-path=<path> and default setting to match monolith
+        XFileSearchPathDefault in Imake (including extra directories used in
+        Debian section of linux.cf.)
+
+commit 52edad6913e3efd3fcec6c73e13d33bf8c3a5e65
+Author: Alan Coopersmith <Alan.Coopersmith@sun.com>
+Date:   Tue Oct 18 00:00:09 2005 +0000
+
+    Use @LIB_MAN_SUFFIX@ instead of $(LIB_MAN_SUFFIX) in macro substitutions to
+        work better with BSD make
+
+commit 1fcb9d04dd8b2f78aff2d64e6db7588c973cdb5b
+Author: Alan Coopersmith <Alan.Coopersmith@sun.com>
+Date:   Mon Oct 17 21:13:22 2005 +0000
+
+    Rename .shadows.DONE to shadows.DONE to avoid some make's thinking it's a
+        suffix rule (reported by Matthieu Herrb)
+
+commit 4423fc41efc97ad1559f281c2ce3c835ccc88c61
+Author: Alan Coopersmith <Alan.Coopersmith@sun.com>
+Date:   Thu Oct 13 04:27:16 2005 +0000
+
+    Add generated man pages to .cvsignore file
+
+commit 3c676e51ca509fff616495ac7354ac8b4ecde7e4
+Author: Alan Coopersmith <Alan.Coopersmith@sun.com>
+Date:   Wed Oct 12 00:22:32 2005 +0000
+
+    configure.ac Set up cpp pre-processing of man pages Add shadow man pages
+        for man pages that document multiple functions.
+
+commit 0543cf76a5e11133b5f76fa37b39cbe2985c1c75
+Author: Alan Coopersmith <Alan.Coopersmith@sun.com>
+Date:   Sat Sep 24 00:23:32 2005 +0000
+
+    Include <X11/XlibConf.h> to get correct XTHREADS settings in non-Imake
+        builds.
+
+commit 88374bab9adfe73dc445d4202a28e4d6021a674f
+Author: Alan Coopersmith <Alan.Coopersmith@sun.com>
+Date:   Wed Sep 21 02:35:01 2005 +0000
+
+    Add checks for poll & snprintf & define old Imake names if found Enable XKB
+        usage in Xt unless --disable-xkb is specified Set STRINGSABIOPTIONS for
+        building StringDefs files on Solaris, SCO, and SVR4 systems.
+
+commit dbd0485a6e1926e7b94fdffb3e71de27c4a29012
+Author: Adam Jackson <ajax@nwnk.net>
+Date:   Mon Aug 1 23:59:39 2005 +0000
+
+    Properly define BUILT_FILES
+
+commit f4043547fbb2feb87f480388a695016b90f53279
+Author: Keith Packard <keithp@keithp.com>
+Date:   Mon Aug 1 23:47:55 2005 +0000
+
+    Move building of StringDefs files to src and fix them so that parallel make
+        works right.
+
+commit 027977140e19c5622331ac90eeb5e9bb9fe72640
+Author: Kevin E Martin <kem@kem.org>
+Date:   Fri Jul 29 21:22:52 2005 +0000
+
+    Various changes preparing packages for RC0:
+    - Verify and update package version numbers as needed
+    - Implement versioning scheme
+    - Change bug address to point to bugzilla bug entry form
+    - Disable loadable i18n in libX11 by default (use --enable-loadable-i18n to
+        reenable it)
+    - Fix makedepend to use pkgconfig and pass distcheck
+    - Update build script to build macros first
+    - Update modular Xorg version
+
+commit 28845cf017b991f7ed2dd23c005ab36ca43b97a5
+Author: Alan Coopersmith <Alan.Coopersmith@sun.com>
+Date:   Fri Jul 22 20:30:10 2005 +0000
+
+    Bug #3824: <https://bugs.freedesktop.org/show_bug.cgi?id=3824> Correct
+        incomplete license statement from Sun.
+
+commit 052efe144da64f96fb1201a36933894d2d4bfb3c
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Tue Jul 19 02:00:01 2005 +0000
+
+    distcheck fixes -- clean up after makestrs, don't list non-existant files.
+
+commit e1cd82cf0b4d51db42c5d71a63805b6fb9ad45b8
+Author: Matthieu Herrb <matthieu.herrb@laas.fr>
+Date:   Sun Jul 17 10:15:26 2005 +0000
+
+    Fix for building outside of srcdir.
+
+commit 40bf5c6a837430bf23f86b97fcde8237099511c0
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Sat Jul 16 07:37:19 2005 +0000
+
+    Set version number to 6.0.0 with -version-number.
+
+commit 265f56bafdca73f28a4937ebff86ac77a25f2d4b
+Author: Keith Packard <keithp@keithp.com>
+Date:   Sat Jul 9 06:49:50 2005 +0000
+
+    Add .cvsignore files
+
+commit 63a4f8f76f5fb9159447878a4a85a14d0fbf4bf6
+Author: Alexander Gottwald <alexander.gottwald@s1999.tu-chemnitz.de>
+Date:   Thu Jun 30 12:23:32 2005 +0000
+
+    Add -no-undefined to linker command to build shared library on cygwin too
+
+commit 64b2b98096c6a5b2ac3af59796e07601eee4e28a
+Author: Søren Sandmann Pedersen <sandmann@daimi.au.dk>
+Date:   Mon Jun 20 21:47:20 2005 +0000
+
+    - Make Xt install its internal files in /usr/include/X11, both in the
+        modular and the monolithic tree.
+    - Update XTrap to use #include <X11/internal-xt-headerI.h>
+    - Add XvMC to symlink.sh
+
+commit 6e10d9886cfe518d1407331a7a8e5bac85390249
+Author: Alexander Gottwald <alexander.gottwald@s1999.tu-chemnitz.de>
+Date:   Fri Jun 10 12:19:31 2005 +0000
+
+    ensure $(buildir)/src and $(builddir)/include/X11 exist before installing
+        generated files there
+
+commit 1b5fb35a8db7bcf568a2318118068b6c01169c14
+Author: Alexander Gottwald <alexander.gottwald@s1999.tu-chemnitz.de>
+Date:   Tue May 24 16:06:12 2005 +0000
+
+    separation of source and build directories
+
+commit e6db93aff3a4e92b8d13998866a787bdc08b6f35
+Author: Alexander Gottwald <alexander.gottwald@s1999.tu-chemnitz.de>
+Date:   Tue May 24 15:58:51 2005 +0000
+
+    Make source directory for templates configurable
+
+commit 82f3473668ed08af059e094a696911d2347e5d57
+Author: Alan Coopersmith <Alan.Coopersmith@sun.com>
+Date:   Sun May 22 19:05:11 2005 +0000
+
+    Convert man pages to long file names in lib/X11, lib/Xt, & lib/Xext
+
+commit 1c6db5c90aa4b4c7c82b0676416c2a9a0baa6c67
+Author: Alan Coopersmith <Alan.Coopersmith@sun.com>
+Date:   Sun May 22 04:25:43 2005 +0000
+
+    Check for <alloca.h> and define INCLUDE_ALLOCA_H if found, since
+        <Xalloca.h> requires it.
+
+commit 2e00049e9b02e26f858c3e4510641a735c03b086
+Author: Alan Coopersmith <Alan.Coopersmith@sun.com>
+Date:   Sat May 21 20:47:26 2005 +0000
+
+    Use $(install_sh_DATA) instead of "install" for better portability. Remove
+        duplicate installation lines.
+    Add AM_CFLAGS to pass through XT_CFLAGS & X11_CFLAGS
+
+commit a175c9ea92967441a7ad33d2f6c8bf26cbe954fe
+Author: Adam Jackson <ajax@nwnk.net>
+Date:   Thu May 19 00:22:33 2005 +0000
+
+    revert last change, didn't do right thing at all, sorry for the noise
+
+commit 185284247a889358b2ea269424eb665a71079826
+Author: Adam Jackson <ajax@nwnk.net>
+Date:   Thu May 19 00:10:08 2005 +0000
+
+    Require automake 1.7 in AM_INIT_AUTOMAKE
+
+commit c7fe09644945e3725c0b67b84cd24d8475cea184
+Author: Søren Sandmann Pedersen <sandmann@daimi.au.dk>
+Date:   Wed May 18 19:34:25 2005 +0000
+
+    Also include include/X11
+
+commit 605a76dcc93e277e1b26841a0225b7e0fb851b76
+Author: Søren Sandmann Pedersen <sandmann@daimi.au.dk>
+Date:   Wed May 18 15:38:31 2005 +0000
+
+    - conditionally include config.h in xc/lib/Xt sources
+    - add build system for lib/Xt
+
+commit b0a241cf7c7ab3840929da3b1aabdda7bab22517
+Author: Egbert Eich <eich@suse.de>
+Date:   Tue May 17 08:10:10 2005 +0000
+
+    gcc4 allows to check if sentinels are correct (a sentinel is the
+        terminating element in a varargs list). A sentinel needs to be NULL,
+        not 0 - which doesn't make a difference on 32bit but matters on 64bit.
+        Furthermore it can be told that functions have a printf-like format
+        string and argument list so that they can verify that both match. To
+        use these features certain attributes need to be set - which are
+        compiler specific. To do this we define macros which are expanded
+        depending on the compiler version. For now we put those in
+        include/Xfuncproto.h (the XFree86 DDX layer contains a file compiler.h
+        which however is not visible outside the DDX) (Bugzilla #3268).
+
+commit 2b42b9154f9886ab05da1c3d6ce75fd95f59e04e
+Author: Alan Coopersmith <Alan.Coopersmith@sun.com>
+Date:   Sun May 15 20:52:39 2005 +0000
+
+    Add settings to bring Solaris builds closer to the ones Sun packages in
+        Solaris. Adds "BuildLikeSun" options for areas Sun deviates from the
+        way Xorg is packaged on other platforms. See comment in sun.cf for
+        details. Also, use system-provided Expat on Solaris 10 and other
+        cleanups.
+    Set shared library versions for Solaris builds to match versions used in
+        Solaris. Add missing SharedXfixesReqs and SharedXdamageReqs.
+    Add -solarisabi option to create XtStrings code compatibile with existing
+        Solaris binaries. (Off by default, on if "BuildLikeSun" is set in
+        sun.cf)
+
+commit 149898492fe56f6a096a875375faa7323f7e96f4
+Author: Alexander Gottwald <alexander.gottwald@s1999.tu-chemnitz.de>
+Date:   Wed Apr 20 09:35:50 2005 +0000
+
+    Bugzilla #3072 (https://bugs.freedesktop.org/show_bug.cgi?id=3072)
+        attachment #2469 (https://bugs.freedesktop.org/attachment.cgi?id=2469):
+        fix uninitialized pointer in libXt on Win32. Reported by Dave Williss
+
+commit 85eb751e4e1683af6cee3ee9dce29f74911a639d
+Author: Matthieu Herrb <matthieu.herrb@laas.fr>
+Date:   Mon Feb 21 21:08:27 2005 +0000
+
+    Convert lib/Xt to ANSI C (Thomas Dickey). Fixes for a few valgrind warnings
+        (Thomas Dickey).
+
+commit 94150cb72d9d641c64325cd70323d93b9a3701a5
+Author: Alan Coopersmith <Alan.Coopersmith@sun.com>
+Date:   Wed Jan 19 19:27:34 2005 +0000
+
+    doc/man/Xt/Imakefile
+    doc/man/Xt/XtAddCbk.man
+    doc/man/Xt/XtAddIn.man
+    doc/man/Xt/XtAllocGC.man
+    doc/man/Xt/XtAppE.man
+    doc/man/Xt/XtAppEM.man
+    doc/man/Xt/XtAppSTC.man
+    doc/man/Xt/XtClass.man
+    doc/man/Xt/XtConvSt.man
+    doc/man/Xt/XtConvert.man
+    doc/man/Xt/XtCreateSR.man
+    doc/man/Xt/XtDisplayI.man
+    doc/man/Xt/XtErr.man
+    doc/man/Xt/XtErrM.man
+    doc/man/Xt/XtExtEvDis.man
+    doc/man/Xt/XtGEDB.man
+    doc/man/Xt/XtGetANC.man
+    doc/man/Xt/XtGetActK.man
+    doc/man/Xt/XtGetAres.man
+    doc/man/Xt/XtGetSTO.man
+    doc/man/Xt/XtGetSres.man
+    doc/man/Xt/XtInit.man
+    doc/man/Xt/XtInitWC.man
+    doc/man/Xt/XtManChild.man
+    doc/man/Xt/XtOffset.man
+    doc/man/Xt/XtOwnSel.man
+    doc/man/Xt/XtRegDraw.man
+    doc/man/Xt/XtResPA.man
+    doc/man/Xt/XtSession.man
+    doc/man/Xt/XtSetLangP.man
+    doc/man/Xt/XtSetSP.man
+    doc/man/Xt/XtSetVal.man
+    //bugs.freedesktop.org/show_bug.cgi?id=2331> Attachment #1718
+        <https://bugs.freedesktop.org/attachment.cgi?id=1718>
+
+commit cd85103c7298be4a13909c07c95f5d53b069966e
+Author: Matthieu Herrb <matthieu.herrb@laas.fr>
+Date:   Sun Jan 2 11:08:49 2005 +0000
+
+    Fix formatting.
+
+commit 054445f4238a98b7ea7910778ed110f5eff9d4f2
+Author: Matthieu Herrb <matthieu.herrb@laas.fr>
+Date:   Sun Oct 3 20:08:42 2004 +0000
+
+    Xt Manual pages fixes from Dmitry Bolkhovitanov (Bugzilla #1498, $1499).
+
+commit 045e3de107523f28e765da8239d6afa9f51d6ba2
+Author: Kevin E Martin <kem@kem.org>
+Date:   Wed Aug 11 21:14:17 2004 +0000
+
+    Apply PPC64 build patch (Bug #303, Mike A. Harris, Alan Coopersmith).
+
+commit 7a541dcaa28b6f97a647d0d8e0873f665ea372aa
+Author: Eric Anholt <anholt@freebsd.org>
+Date:   Sat Jul 31 01:21:51 2004 +0000
+
+    Rename some COMPOSITE macros and enums to avoid conflicting with the
+        COMPOSITE extension's new macro. These appear to only be used
+        internally.
+
+commit b83924fa380f9e68c0c8a9dada6094c95fc44441
+Author: Egbert Eich <eich@suse.de>
+Date:   Fri Apr 23 18:43:54 2004 +0000
+
+    Merging XORG-CURRENT into trunk
+
+commit 1b4f95dee32054b4d14ed5f78e47371c544fc5ac
+Author: Egbert Eich <eich@suse.de>
+Date:   Sun Mar 14 08:32:26 2004 +0000
+
+    Importing vendor version xf86-4_4_99_1 on Sun Mar 14 00:26:39 PST 2004
+
+commit 83e661ed1cec6b14c60adbd48ab8588f6b13c391
+Author: Egbert Eich <eich@suse.de>
+Date:   Wed Mar 3 12:11:32 2004 +0000
+
+    Importing vendor version xf86-4_4_0 on Wed Mar 3 04:09:24 PST 2004
+
+commit 77d281253982e2ebe27430f38b993927d879a005
+Author: Egbert Eich <eich@suse.de>
+Date:   Thu Feb 26 13:35:34 2004 +0000
+
+    readding XFree86's cvs IDs
+
+commit 0efb2e616125953a3773b9b6c9a530ad30ce9bc8
+Author: Egbert Eich <eich@suse.de>
+Date:   Thu Feb 26 09:22:45 2004 +0000
+
+    Importing vendor version xf86-4_3_99_903 on Wed Feb 26 01:21:00 PST 2004
+
+commit 036e955dfcc31d3b6c081f84e4f0b85969ccdd12
+Author: Egbert Eich <eich@suse.de>
+Date:   Thu Jan 29 08:08:07 2004 +0000
+
+    Importing vendor version xf86-012804-2330 on Thu Jan 29 00:06:33 PST 2004
+
+commit f81d7ef72c9b4f13e33efa812bed9446657ed003
+Author: Kaleb Keithley <kaleb@freedesktop.org>
+Date:   Tue Nov 25 19:28:16 2003 +0000
+
+    XFree86 4.3.99.16 Bring the tree up to date for the Cygwin folks
+
+commit bdc0667ef29e24b1a2188b11546d843a7d3e5ef6
+Author: Kaleb Keithley <kaleb@freedesktop.org>
+Date:   Fri Nov 14 16:48:49 2003 +0000
+
+    XFree86 4.3.0.1
+
+commit 6a13c9e08bb042c81ae904c44a38a50d785c824e
+Author: Kaleb Keithley <kaleb@freedesktop.org>
+Date:   Fri Nov 14 16:48:49 2003 +0000
+
+    Initial revision
+
+commit 0117b0b441d8835a11a2886f3c8aed937dcffa9d
+Author: Kaleb Keithley <kaleb@freedesktop.org>
+Date:   Fri Nov 14 15:54:39 2003 +0000
+
+    R6.6 is the Xorg base-line
diff --git a/INSTALL b/INSTALL
new file mode 100644 (file)
index 0000000..8b82ade
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,291 @@
+Installation Instructions
+*************************
+
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
+2006, 2007, 2008 Free Software Foundation, Inc.
+
+   This file is free documentation; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+
+Basic Installation
+==================
+
+   Briefly, the shell commands `./configure; make; make install' should
+configure, build, and install this package.  The following
+more-detailed instructions are generic; see the `README' file for
+instructions specific to this package.
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions.  Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+   It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring.  Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.
+
+   If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release.  If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+   The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'.  You need `configure.ac' if
+you want to change it or regenerate `configure' using a newer version
+of `autoconf'.
+
+The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.
+
+     Running `configure' might take a while.  While running, it prints
+     some messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Optionally, type `make check' to run any self-tests that come with
+     the package.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.
+
+  5. You can remove the program binaries and object files from the
+     source code directory by typing `make clean'.  To also remove the
+     files that `configure' created (so you can compile the package for
+     a different kind of computer), type `make distclean'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+  6. Often, you can also type `make uninstall' to remove the installed
+     files again.
+
+Compilers and Options
+=====================
+
+   Some systems require unusual options for compilation or linking that
+the `configure' script does not know about.  Run `./configure --help'
+for details on some of the pertinent environment variables.
+
+   You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment.  Here
+is an example:
+
+     ./configure CC=c99 CFLAGS=-g LIBS=-lposix
+
+   *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+   You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you can use GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+   With a non-GNU `make', it is safer to compile the package for one
+architecture at a time in the source code directory.  After you have
+installed the package for one architecture, use `make distclean' before
+reconfiguring for another architecture.
+
+   On MacOS X 10.5 and later systems, you can create libraries and
+executables that work on multiple system types--known as "fat" or
+"universal" binaries--by specifying multiple `-arch' options to the
+compiler but only a single `-arch' option to the preprocessor.  Like
+this:
+
+     ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+                 CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+                 CPP="gcc -E" CXXCPP="g++ -E"
+
+   This is not guaranteed to produce working output in all cases, you
+may have to build one architecture at a time and combine the results
+using the `lipo' tool if you have problems.
+
+Installation Names
+==================
+
+   By default, `make install' installs the package's commands under
+`/usr/local/bin', include files under `/usr/local/include', etc.  You
+can specify an installation prefix other than `/usr/local' by giving
+`configure' the option `--prefix=PREFIX'.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+pass the option `--exec-prefix=PREFIX' to `configure', the package uses
+PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like `--bindir=DIR' to specify different values for particular
+kinds of files.  Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+   Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System).  The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Particular systems
+==================
+
+   On HP-UX, the default C compiler is not ANSI C compatible.  If GNU
+CC is not installed, it is recommended to use the following options in
+order to use an ANSI C compiler:
+
+     ./configure CC="cc -Ae"
+
+and if that doesn't work, install pre-built binaries of GCC for HP-UX.
+
+   On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
+parse its `<wchar.h>' header file.  The option `-nodtk' can be used as
+a workaround.  If GNU CC is not installed, it is therefore recommended
+to try
+
+     ./configure CC="cc"
+
+and if that doesn't work, try
+
+     ./configure CC="cc -nodtk"
+
+Specifying the System Type
+==========================
+
+   There may be some features `configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on.  Usually, assuming the package is built to be run on the
+_same_ architectures, `configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
+`--build=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+     CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+     OS KERNEL-OS
+
+   See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+   If you are _building_ compiler tools for cross-compiling, you should
+use the option `--target=TYPE' to select the type of system they will
+produce code for.
+
+   If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+   If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+   Variables not defined in a site shell script can be set in the
+environment passed to `configure'.  However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost.  In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'.  For example:
+
+     ./configure CC=/usr/local2/bin/gcc
+
+causes the specified `gcc' to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+Unfortunately, this technique does not work for `CONFIG_SHELL' due to
+an Autoconf bug.  Until the bug is fixed you can use this workaround:
+
+     CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+`configure' Invocation
+======================
+
+   `configure' recognizes the following options to control how it
+operates.
+
+`--help'
+`-h'
+     Print a summary of all of the options to `configure', and exit.
+
+`--help=short'
+`--help=recursive'
+     Print a summary of the options unique to this package's
+     `configure', and exit.  The `short' variant lists options used
+     only in the top level, while the `recursive' variant lists options
+     also present in any nested packages.
+
+`--version'
+`-V'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`--cache-file=FILE'
+     Enable the cache: use and save the results of the tests in FILE,
+     traditionally `config.cache'.  FILE defaults to `/dev/null' to
+     disable caching.
+
+`--config-cache'
+`-C'
+     Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to `/dev/null' (any error
+     messages will still be shown).
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`--prefix=DIR'
+     Use DIR as the installation prefix.  *Note Installation Names::
+     for more details, including other options available for fine-tuning
+     the installation locations.
+
+`--no-create'
+`-n'
+     Run the configure checks, but stop before creating any output
+     files.
+
+`configure' also accepts some other, not widely useful, options.  Run
+`configure --help' for more details.
+
diff --git a/Makefile.am b/Makefile.am
new file mode 100644 (file)
index 0000000..7aece78
--- /dev/null
@@ -0,0 +1,40 @@
+#
+#  Copyright Â© 2003 Keith Packard, Noah Levitt
+#
+#  Permission to use, copy, modify, distribute, and sell this software and its
+#  documentation for any purpose is hereby granted without fee, provided that
+#  the above copyright notice appear in all copies and that both that
+#  copyright notice and this permission notice appear in supporting
+#  documentation, and that the name of Keith Packard not be used in
+#  advertising or publicity pertaining to distribution of the software without
+#  specific, written prior permission.  Keith Packard makes no
+#  representations about the suitability of this software for any purpose.  It
+#  is provided "as is" without express or implied warranty.
+#
+#  KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+#  INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+#  EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+#  CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+#  DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+#  TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+#  PERFORMANCE OF THIS SOFTWARE.
+
+SUBDIRS = util src include man specs test
+
+ACLOCAL_AMFLAGS = -I m4
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = xt.pc
+
+MAINTAINERCLEANFILES = ChangeLog INSTALL
+
+.PHONY: ChangeLog INSTALL
+
+INSTALL:
+       $(INSTALL_CMD)
+
+ChangeLog:
+       $(CHANGELOG_CMD)
+
+dist-hook: ChangeLog INSTALL
+
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..40785f4
--- /dev/null
+++ b/README
@@ -0,0 +1,59 @@
+libXt - X Toolkit Intrinsics library
+
+Documentation for this library can be found in the included man pages;
+the libXt spec from the specs directory of the source, also available at:
+
+       http://www.x.org/releases/X11R7.6/doc/Xt/Xt.html
+       http://www.x.org/releases/X11R7.6/doc/Xt/Xt.pdf
+
+and the O'Reilly X Toolkit books, which they have made freely available online:
+
+ - X Series Volume 4: X Toolkit Intrinsics Programming Manual,
+       1st Edition (1990, covers X11R3)
+
+       http://www.archive.org/details/xtoolkitintrsin20400nyemiss
+
+ - X Series Volume 4: X Toolkit Intrinsics Programming Manual,
+       2nd Edition (1990, covers X11R4)
+
+       http://www.archive.org/details/xtoolkitintrinsi04nyemiss
+
+ - X Series Volume 4: X Toolkit Intrinsics Programming Manual,
+       Motif Edition (1990, covers X11R4/Motif 1.1)
+
+       http://www.archive.org/details/xtoolktintrmotif04nyemiss
+
+ - X Series Volume 4: X Toolkit Intrinsics Programming Manual,
+       3rd Edition (1993, covers X11R5)
+
+       http://www.archive.org/details/xtoolkitintrinsic04nyemiss
+
+ - X Series Volume 5: X Toolkit Intrinsics Reference Manual
+       (1990, covers X11R4)
+
+       http://www.archive.org/details/xtoolkitintrinsi04nyemiss
+
+
+All questions regarding this software should be directed at the
+Xorg mailing list:
+
+        http://lists.freedesktop.org/mailman/listinfo/xorg
+
+Please submit bug reports to the Xorg bugzilla:
+
+        https://bugs.freedesktop.org/enter_bug.cgi?product=xorg
+
+The master development code repository can be found at:
+
+        git://anongit.freedesktop.org/git/xorg/lib/libXt
+
+        http://cgit.freedesktop.org/xorg/lib/libXt
+
+For patch submission instructions, see:
+
+       http://www.x.org/wiki/Development/Documentation/SubmittingPatches
+
+For more information on the git code manager, see:
+
+        http://wiki.x.org/wiki/GitPage
+
diff --git a/configure.ac b/configure.ac
new file mode 100644 (file)
index 0000000..d15b326
--- /dev/null
@@ -0,0 +1,184 @@
+#
+#  Copyright Â© 2003 Keith Packard, Noah Levitt
+#
+#  Permission to use, copy, modify, distribute, and sell this software and its
+#  documentation for any purpose is hereby granted without fee, provided that
+#  the above copyright notice appear in all copies and that both that
+#  copyright notice and this permission notice appear in supporting
+#  documentation, and that the name of Keith Packard not be used in
+#  advertising or publicity pertaining to distribution of the software without
+#  specific, written prior permission.  Keith Packard makes no
+#  representations about the suitability of this software for any purpose.  It
+#  is provided "as is" without express or implied warranty.
+#
+#  KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+#  INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+#  EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+#  CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+#  DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+#  TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+#  PERFORMANCE OF THIS SOFTWARE.
+#
+
+# Initialize Autoconf
+AC_PREREQ([2.60])
+AC_INIT([libXt], [1.1.3],
+        [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], [libXt])
+AC_CONFIG_SRCDIR([Makefile.am])
+AC_CONFIG_HEADERS([config.h])
+AC_CONFIG_MACRO_DIR([m4])
+
+# Initialize Automake
+AM_INIT_AUTOMAKE([foreign dist-bzip2])
+AM_MAINTAINER_MODE
+
+# Initialize libtool
+AC_PROG_LIBTOOL
+
+# Require X.Org macros 1.13 or later for XORG_ENABLE_UNIT_TESTS
+m4_ifndef([XORG_MACROS_VERSION],
+          [m4_fatal([must install xorg-macros 1.13 or later before running autoconf/autogen])])
+XORG_MACROS_VERSION(1.13)
+XORG_DEFAULT_OPTIONS
+XORG_CHECK_MALLOC_ZERO
+XORG_ENABLE_SPECS
+XORG_WITH_XMLTO(0.0.20)
+XORG_WITH_FOP
+XORG_WITH_XSLTPROC
+XORG_CHECK_SGML_DOCTOOLS(1.01)
+XORG_PROG_RAWCPP
+XORG_WITH_PERL
+
+
+# Checks for header files.
+AC_CHECK_HEADER([alloca.h], AC_DEFINE(INCLUDE_ALLOCA_H, 1, [Define to 1 if Xalloca.h should include <alloca.h>]))
+
+# Obtain compiler/linker options for depedencies
+PKG_CHECK_MODULES(XT, sm ice x11 xproto kbproto)
+
+# Set-up variables to use build machine compiler when cross-compiling
+if test x"$CC_FOR_BUILD" = x; then
+       if test x"$cross_compiling" = xyes; then
+               AC_CHECK_PROGS(CC_FOR_BUILD, gcc cc)
+       else
+               CC_FOR_BUILD="$CC"
+       fi
+fi
+AC_SUBST([CC_FOR_BUILD])
+CFLAGS_FOR_BUILD=${CFLAGS_FOR_BUILD-${CFLAGS}}
+AC_SUBST(CFLAGS_FOR_BUILD)
+LDFLAGS_FOR_BUILD=${LDFLAGS_FOR_BUILD-${LDFLAGS}}
+AC_SUBST(LDFLAGS_FOR_BUILD)
+
+# Map function checks to old Imake #defines
+case $host_os in
+       # darwin through Snow Leopard has poll() but can't be used to poll character devices.
+       darwin@<:@789@:>@*|darwin10*) ;;
+       darwin*)
+               _ac_xorg_macosx_version_min=""
+               if echo $CPPFLAGS $CFLAGS | grep -q mmacosx-version-min ; then
+                       _ac_xorg_macosx_version_min=`echo $CPPFLAGS $CFLAGS | sed 's/^.*-mmacosx-version-min=\(@<:@^ @:>@*\).*$/\1/'`
+               else
+                       _ac_xorg_macosx_version_min=$MACOSX_DEPLOYMENT_TARGET
+               fi
+               case $_ac_xorg_macosx_version_min in
+                       10.@<:@0123456@:>@|10.@<:@0123456@:>@.*) ;;
+                       *)
+                               AC_CHECK_FUNC(poll, [AC_DEFINE(USE_POLL, 1, [poll() function is available])], )
+                       ;;
+               esac
+               unset _ac_xorg_macosx_version_min
+               ;;
+       *)
+               AC_CHECK_FUNC(poll, [AC_DEFINE(USE_POLL, 1, [poll() function is available])], )
+       ;;
+esac
+
+# Link with winsock if mingw target
+case $host_os in
+       *mingw*)
+               AC_HAVE_LIBRARY(ws2_32)
+       ;;
+       *)
+       ;;
+esac
+
+# Options
+AC_ARG_ENABLE(xkb, AS_HELP_STRING([--disable-xkb], [Disable XKB support]),
+       XKB="$enableval", XKB="yes")
+if test "x$XKB" = "xyes" ; then
+       AC_DEFINE(XKB, 1, [Define to 1 to use XKB for keysym resolution.])
+fi
+
+# --enable-unit-tests
+XORG_ENABLE_UNIT_TESTS
+XORG_WITH_GLIB([2.16])
+
+# Memory checking support
+case $host_os in
+     solaris*)
+        AC_CHECK_LIB([umem], [umem_alloc],
+            [MALLOC_DEBUG_ENV='LD_PRELOAD=libumem.so UMEM_DEBUG=default'])
+        ;;
+     *-gnu*) # GNU libc - Value is used as a single byte bit pattern,
+        # both directly and inverted, so should not be 0 or 255.
+        MALLOC_DEBUG_ENV='MALLOC_PERTURB_=15'
+        ;;
+     *bsd*|darwin*)
+        MALLOC_DEBUG_ENV='MallocPreScribble=1 MallocScribble=1'
+        ;;
+esac
+AC_SUBST([MALLOC_DEBUG_ENV])
+
+# Replaces XFileSearchPathDefault from Imake configs
+XFILESEARCHPATHDEFAULT='$(sysconfdir)/X11/%L/%T/%N%C%S:$(sysconfdir)/X11/%l/%T/%N%C%S:$(sysconfdir)/X11/%T/%N%C%S:$(sysconfdir)/X11/%L/%T/%N%S:$(sysconfdir)/X11/%l/%T/%N%S:$(sysconfdir)/X11/%T/%N%S:$(datadir)/X11/%L/%T/%N%C%S:$(datadir)/X11/%l/%T/%N%C%S:$(datadir)/X11/%T/%N%C%S:$(datadir)/X11/%L/%T/%N%S:$(datadir)/X11/%l/%T/%N%S:$(datadir)/X11/%T/%N%S:$(libdir)/X11/%L/%T/%N%C%S:$(libdir)/X11/%l/%T/%N%C%S:$(libdir)/X11/%T/%N%C%S:$(libdir)/X11/%L/%T/%N%S:$(libdir)/X11/%l/%T/%N%S:$(libdir)/X11/%T/%N%S'
+
+AC_ARG_WITH(xfile-search-path,
+       AS_HELP_STRING([--with-xfile-search-path=<path>],
+                      [Set path to search for app-defaults and other files]),
+       [XFILESEARCHPATHDEFAULT="$withval"], [])
+AC_SUBST([XFILESEARCHPATHDEFAULT])
+
+AC_ARG_WITH(appdefaultdir,
+       AS_HELP_STRING([--with-appdefaultdir=<path>],
+                      [Set app-default directory (default: ${datadir}/X11/app-defaults)]),
+       [appdefaultdir="$withval"],
+       [appdefaultdir=${datadir}/X11/app-defaults])
+AX_DEFINE_DIR([appdefaultdir], [appdefaultdir], [app default data directory])
+
+# Replacement for Imake ToolkitStringsABIOptions, controls string tables
+# generated by util/string.list in StringDefs.h & Shell.h
+case $host_os in
+       solaris*)
+               # Solaris uses -intelabi even on SPARC
+               STRINGSABIOPTIONS="-intelabi -solarisabinames"
+               ;;
+       sco* | svr4*)
+               case $host_cpu in
+                   i*86) STRINGSABIOPTIONS="-intelabi" ;;
+                      *) STRINGSABIOPTIONS="" ;;
+               esac
+               ;;
+esac
+AC_SUBST(STRINGSABIOPTIONS)
+
+case $host_os in
+    darwin*)
+        OS_CFLAGS="-Wl,-flat_namespace"
+       ;;
+    *)
+        OS_CFLAGS=
+        ;;
+esac
+
+XT_CFLAGS="$XT_CFLAGS $OS_CFLAGS"
+
+AC_CONFIG_FILES([Makefile
+               src/Makefile
+               util/Makefile
+               include/Makefile
+               man/Makefile
+               specs/Makefile
+               test/Makefile
+               xt.pc])
+AC_OUTPUT
diff --git a/docbook.am b/docbook.am
new file mode 100644 (file)
index 0000000..bba4d54
--- /dev/null
@@ -0,0 +1,105 @@
+#
+# Generate output formats for a single DocBook/XML with/without chapters
+#
+# Variables set by the calling Makefile:
+# shelfdir: the location where the docs/specs are installed. Typically $(docdir)
+# docbook:  the main DocBook/XML file, no chapters, appendix or image files
+# chapters: all files pulled in by an XInclude statement and images.
+#
+
+#
+# This makefile is intended for Users Documentation and Functional Specifications.
+# Do not use for Developer Documentation which is not installed and does not require olink.
+# Refer to http://www.x.org/releases/X11R7.6/doc/xorg-docs/ReleaseNotes.html#id2584393
+# for an explanation on documents classification.
+#
+
+# DocBook/XML generated output formats to be installed
+shelf_DATA =
+
+# DocBook/XML file with chapters, appendix and images it includes
+dist_shelf_DATA = $(docbook) $(chapters)
+
+if HAVE_XMLTO
+if HAVE_STYLESHEETS
+
+XMLTO_SEARCHPATH_FLAGS =                               \
+       --searchpath "$(XORG_SGML_PATH)/X11"            \
+       --searchpath "$(abs_top_builddir)"
+XMLTO_HTML_OLINK_FLAGS = \
+       --stringparam target.database.document=$(XORG_SGML_PATH)/X11/dbs/masterdb.html.xml \
+       --stringparam current.docid="$(<:.xml=)"
+XMLTO_HTML_STYLESHEET_FLAGS = -x $(STYLESHEET_SRCDIR)/xorg-xhtml.xsl
+XMLTO_HTML_FLAGS =                                     \
+       $(XMLTO_SEARCHPATH_FLAGS)                       \
+       $(XMLTO_HTML_STYLESHEET_FLAGS)                  \
+       $(XMLTO_HTML_OLINK_FLAGS)
+
+shelf_DATA += $(docbook:.xml=.html)
+%.html: %.xml $(chapters)
+       $(AM_V_GEN)$(XMLTO) $(XMLTO_HTML_FLAGS) xhtml-nochunks $<
+
+if HAVE_XMLTO_TEXT
+
+shelf_DATA += $(docbook:.xml=.txt)
+%.txt: %.xml $(chapters)
+       $(AM_V_GEN)$(XMLTO) $(XMLTO_HTML_FLAGS) txt $<
+endif HAVE_XMLTO_TEXT
+
+if HAVE_FOP
+XMLTO_FO_IMAGEPATH_FLAGS = --stringparam img.src.path=$(abs_builddir)/
+XMLTO_PDF_OLINK_FLAGS = \
+       --stringparam target.database.document=$(XORG_SGML_PATH)/X11/dbs/masterdb.pdf.xml \
+       --stringparam current.docid="$(<:.xml=)"
+XMLTO_FO_STYLESHEET_FLAGS = -x $(STYLESHEET_SRCDIR)/xorg-fo.xsl
+
+XMLTO_FO_FLAGS =                                       \
+       $(XMLTO_SEARCHPATH_FLAGS)                       \
+       $(XMLTO_FO_STYLESHEET_FLAGS)                    \
+       $(XMLTO_FO_IMAGEPATH_FLAGS)                     \
+       $(XMLTO_PDF_OLINK_FLAGS)
+
+shelf_DATA += $(docbook:.xml=.pdf)
+%.pdf: %.xml $(chapters)
+       $(AM_V_GEN)$(XMLTO) $(XMLTO_FO_FLAGS) --with-fop pdf $<
+
+shelf_DATA += $(docbook:.xml=.ps)
+%.ps: %.xml $(chapters)
+       $(AM_V_GEN)$(XMLTO) $(XMLTO_FO_FLAGS) --with-fop ps $<
+endif HAVE_FOP
+
+# Generate documents cross-reference target databases
+if HAVE_XSLTPROC
+
+XSLT_SEARCHPATH_FLAGS =                                \
+       --path "$(XORG_SGML_PATH)/X11"                  \
+       --path "$(abs_top_builddir)"
+XSLT_OLINK_FLAGS =                                     \
+       --stringparam targets.filename "$@"             \
+       --stringparam collect.xref.targets "only"       \
+       --stringparam olink.base.uri "$(@:.db=)"
+
+XSLT_HTML_FLAGS =                                      \
+       $(XSLT_SEARCHPATH_FLAGS)                        \
+       $(XSLT_OLINK_FLAGS)                             \
+       --nonet --xinclude                              \
+       $(STYLESHEET_SRCDIR)/xorg-xhtml.xsl
+XSLT_PDF_FLAGS =                                       \
+       $(XSLT_SEARCHPATH_FLAGS)                        \
+       $(XSLT_OLINK_FLAGS)                             \
+       --nonet --xinclude                              \
+       $(STYLESHEET_SRCDIR)/xorg-fo.xsl
+
+shelf_DATA += $(docbook:.xml=.html.db)
+%.html.db: %.xml  $(chapters)
+       $(AM_V_GEN)$(XSLTPROC) $(XSLT_HTML_FLAGS) $<
+
+shelf_DATA += $(docbook:.xml=.pdf.db)
+%.pdf.db: %.xml $(chapters)
+       $(AM_V_GEN)$(XSLTPROC) $(XSLT_PDF_FLAGS) $<
+
+endif HAVE_XSLTPROC
+endif HAVE_STYLESHEETS
+endif HAVE_XMLTO
+
+CLEANFILES = $(shelf_DATA)
diff --git a/include/Makefile.am b/include/Makefile.am
new file mode 100644 (file)
index 0000000..5b68782
--- /dev/null
@@ -0,0 +1,44 @@
+xtincludedir = ${includedir}/X11
+
+xtinclude_HEADERS = \
+       X11/Composite.h \
+       X11/CompositeP.h \
+       X11/ConstrainP.h \
+       X11/Constraint.h \
+       X11/Core.h \
+       X11/CoreP.h \
+       X11/Intrinsic.h \
+       X11/IntrinsicP.h \
+       X11/Object.h \
+       X11/ObjectP.h \
+       X11/RectObj.h \
+       X11/RectObjP.h \
+       X11/ResConfigP.h \
+       X11/ShellP.h \
+       X11/Vendor.h \
+       X11/VendorP.h   \
+                       \
+       X11/CallbackI.h \
+       X11/ConvertI.h \
+       X11/CreateI.h \
+       X11/EventI.h \
+       X11/HookObjI.h \
+       X11/InitialI.h \
+       X11/IntrinsicI.h \
+       X11/PassivGraI.h \
+       X11/ResourceI.h \
+       X11/SelectionI.h \
+       X11/ShellI.h \
+       X11/ThreadsI.h \
+       X11/TranslateI.h \
+       X11/VarargsI.h  \
+       X11/Xtos.h
+
+
+nodist_xtinclude_HEADERS = \
+       X11/StringDefs.h \
+       X11/Shell.h
+
+DISTCLEANFILES = \
+       X11/StringDefs.h \
+       X11/Shell.h
diff --git a/include/X11/CallbackI.h b/include/X11/CallbackI.h
new file mode 100644 (file)
index 0000000..5d958f4
--- /dev/null
@@ -0,0 +1,119 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/****************************************************************
+ *
+ * Callbacks
+ *
+ ****************************************************************/
+
+typedef XrmResource **CallbackTable;
+
+#define _XtCBCalling 1
+#define _XtCBFreeAfterCalling 2
+
+_XFUNCPROTOBEGIN
+
+typedef struct internalCallbackRec {
+    unsigned short count;
+    char          is_padded;   /* contains NULL padding for external form */
+    char          call_state;  /* combination of _XtCB{FreeAfter}Calling */
+#ifdef LONG64
+    unsigned int   align_pad;  /* padding to align callback list */
+#endif
+    /* XtCallbackList */
+} InternalCallbackRec, *InternalCallbackList;
+
+typedef Boolean (*_XtConditionProc)(
+    XtPointer  /* data */
+);
+
+extern void _XtAddCallback(
+    InternalCallbackList*      /* callbacks */,
+    XtCallbackProc             /* callback */,
+    XtPointer                  /* closure */
+);
+
+extern void _XtAddCallbackOnce(
+    InternalCallbackList*      /* callbacks */,
+    XtCallbackProc             /* callback */,
+    XtPointer                  /* closure */
+);
+
+extern InternalCallbackList _XtCompileCallbackList(
+    XtCallbackList             /* xtcallbacks */
+);
+
+extern XtCallbackList _XtGetCallbackList(
+    InternalCallbackList*      /* callbacks */
+);
+
+extern void _XtRemoveAllCallbacks(
+    InternalCallbackList*      /* callbacks */
+);
+
+extern void _XtRemoveCallback(
+    InternalCallbackList*      /* callbacks */,
+    XtCallbackProc             /* callback */,
+    XtPointer                  /* closure */
+);
+
+extern void _XtPeekCallback(
+    Widget                     /* widget */,
+    XtCallbackList             /* callbacks */,
+    XtCallbackProc *           /* callback */,
+    XtPointer *                        /* closure */
+);
+
+extern void _XtCallConditionalCallbackList(
+    Widget                     /* widget */,
+    XtCallbackList             /* callbacks */,
+    XtPointer                  /* call_data */,
+    _XtConditionProc           /* cond_proc */
+);
+
+_XFUNCPROTOEND
diff --git a/include/X11/Composite.h b/include/X11/Composite.h
new file mode 100644 (file)
index 0000000..d33234f
--- /dev/null
@@ -0,0 +1,102 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifndef _XtComposite_h
+#define _XtComposite_h
+
+typedef struct _CompositeClassRec *CompositeWidgetClass;
+
+typedef Cardinal (*XtOrderProc)(
+    Widget     /* child */
+);
+
+_XFUNCPROTOBEGIN
+
+extern void XtManageChildren(
+    WidgetList                 /* children */,
+    Cardinal           /* num_children */
+);
+
+extern void XtManageChild(
+    Widget             /* child */
+);
+
+extern void XtUnmanageChildren(
+    WidgetList                 /* children */,
+    Cardinal           /* num_children */
+);
+
+extern void XtUnmanageChild(
+    Widget             /* child */
+);
+
+typedef void (*XtDoChangeProc)(
+    Widget             /* composite_parent */,
+    WidgetList         /* unmanage_children */,
+    Cardinal *         /* num_unmanage_children */,
+    WidgetList         /* manage_children */,
+    Cardinal *         /* num_manage_children */,
+    XtPointer          /* client_data */
+);
+
+extern void XtChangeManagedSet(
+    WidgetList         /* unmanage_children */,
+    Cardinal           /* num_unmanage_children */,
+    XtDoChangeProc     /* do_change_proc */,
+    XtPointer          /* client_data */,
+    WidgetList         /* manage_children */,
+    Cardinal           /* num_manage_children */
+);
+
+_XFUNCPROTOEND
+
+#ifndef VMS
+externalref WidgetClass compositeWidgetClass;
+#endif
+
+#endif /* _XtComposite_h */
+/* DON'T ADD STUFF AFTER THIS #endif */
diff --git a/include/X11/CompositeP.h b/include/X11/CompositeP.h
new file mode 100644 (file)
index 0000000..b1b8559
--- /dev/null
@@ -0,0 +1,113 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifndef _XtCompositeP_h
+#define _XtCompositeP_h
+
+#include <X11/Composite.h>
+
+_XFUNCPROTOBEGIN
+
+/************************************************************************
+ *
+ * Additional instance fields for widgets of (sub)class 'Composite'
+ *
+ ************************************************************************/
+
+typedef struct _CompositePart {
+    WidgetList  children;           /* array of ALL widget children         */
+    Cardinal    num_children;       /* total number of widget children      */
+    Cardinal    num_slots;           /* number of slots in children array    */
+    XtOrderProc insert_position;     /* compute position of new child       */
+} CompositePart,*CompositePtr;
+
+typedef struct _CompositeRec {
+    CorePart      core;
+    CompositePart composite;
+} CompositeRec;
+
+/*********************************************************************
+ *
+ *  Additional class fields for widgets of (sub)class 'Composite'
+ *
+ ********************************************************************/
+
+typedef struct _CompositeClassPart {
+    XtGeometryHandler geometry_manager;          /* geometry manager for children   */
+    XtWidgetProc      change_managed;    /* change managed state of child   */
+    XtWidgetProc      insert_child;      /* physically add child to parent  */
+    XtWidgetProc      delete_child;      /* physically remove child         */
+    XtPointer        extension;          /* pointer to extension record     */
+} CompositeClassPart,*CompositePartPtr;
+
+typedef struct {
+    XtPointer next_extension;  /* 1st 4 mandated for all extension records */
+    XrmQuark record_type;      /* NULLQUARK; on CompositeClassPart */
+    long version;              /* must be XtCompositeExtensionVersion */
+    Cardinal record_size;      /* sizeof(CompositeClassExtensionRec) */
+    Boolean accepts_objects;
+    Boolean allows_change_managed_set;
+} CompositeClassExtensionRec, *CompositeClassExtension;
+
+
+typedef struct _CompositeClassRec {
+     CoreClassPart      core_class;
+     CompositeClassPart composite_class;
+} CompositeClassRec;
+
+externalref CompositeClassRec compositeClassRec;
+
+_XFUNCPROTOEND
+
+#define XtCompositeExtensionVersion 2L
+#define XtInheritGeometryManager ((XtGeometryHandler) _XtInherit)
+#define XtInheritChangeManaged ((XtWidgetProc) _XtInherit)
+#define XtInheritInsertChild ((XtWidgetProc) _XtInherit)
+#define XtInheritDeleteChild ((XtWidgetProc) _XtInherit)
+
+#endif /* _XtCompositeP_h */
+/* DON'T ADD STUFF AFTER THIS #endif */
diff --git a/include/X11/ConstrainP.h b/include/X11/ConstrainP.h
new file mode 100644 (file)
index 0000000..40ff9b9
--- /dev/null
@@ -0,0 +1,96 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifndef _XtConstraintP_h
+#define _XtConstraintP_h
+
+#include <X11/Constraint.h>
+
+_XFUNCPROTOBEGIN
+
+typedef struct _ConstraintPart {
+    XtPointer   mumble;                /* No new fields, keep C compiler happy */
+} ConstraintPart;
+
+typedef struct _ConstraintRec {
+    CorePart       core;
+    CompositePart   composite;
+    ConstraintPart  constraint;
+} ConstraintRec, *ConstraintWidget;
+
+typedef struct _ConstraintClassPart {
+    XtResourceList resources;        /* constraint resource list            */
+    Cardinal   num_resources;         /* number of constraints in list       */
+    Cardinal   constraint_size;       /* size of constraint record           */
+    XtInitProc initialize;            /* constraint initialization           */
+    XtWidgetProc destroy;             /* constraint destroy proc             */
+    XtSetValuesFunc set_values;       /* constraint set_values proc          */
+    XtPointer      extension;          /* pointer to extension record      */
+} ConstraintClassPart;
+
+typedef struct {
+    XtPointer next_extension;  /* 1st 4 mandated for all extension records */
+    XrmQuark record_type;      /* NULLQUARK; on ConstraintClassPart */
+    long version;              /* must be XtConstraintExtensionVersion */
+    Cardinal record_size;      /* sizeof(ConstraintClassExtensionRec) */
+    XtArgsProc get_values_hook;
+} ConstraintClassExtensionRec, *ConstraintClassExtension;
+
+typedef struct _ConstraintClassRec {
+    CoreClassPart       core_class;
+    CompositeClassPart  composite_class;
+    ConstraintClassPart constraint_class;
+} ConstraintClassRec;
+
+externalref ConstraintClassRec constraintClassRec;
+
+_XFUNCPROTOEND
+
+#define XtConstraintExtensionVersion 1L
+
+#endif /* _XtConstraintP_h */
+/* DON'T ADD STUFF AFTER THIS #endif */
diff --git a/include/X11/Constraint.h b/include/X11/Constraint.h
new file mode 100644 (file)
index 0000000..20abead
--- /dev/null
@@ -0,0 +1,62 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifndef _XtConstraint_h
+#define _XtConstraint_h
+
+_XFUNCPROTOBEGIN
+
+typedef struct _ConstraintClassRec *ConstraintWidgetClass;
+
+#ifndef VMS
+externalref WidgetClass constraintWidgetClass;
+#endif
+
+_XFUNCPROTOEND
+
+#endif /* _XtConstraint_h */
+/* DON'T ADD STUFF AFTER THIS #endif */
diff --git a/include/X11/ConvertI.h b/include/X11/ConvertI.h
new file mode 100644 (file)
index 0000000..760d477
--- /dev/null
@@ -0,0 +1,96 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+_XFUNCPROTOBEGIN
+
+/* Representation types */
+
+extern XrmQuark  _XtQString;
+
+/*
+ * Resource conversions
+ */
+
+typedef struct _ConverterRec **ConverterTable;
+
+extern void _XtAddDefaultConverters(
+    ConverterTable     /* table */
+);
+
+extern void _XtSetDefaultConverterTable(
+    ConverterTable*            /* table */
+);
+
+extern void _XtFreeConverterTable(
+    ConverterTable             /* table */
+);
+
+extern void _XtTableAddConverter(
+    ConverterTable             /* table */,
+    XrmRepresentation          /* from_type */,
+    XrmRepresentation          /* to_type */,
+    XtTypeConverter            /* converter */,
+    XtConvertArgList           /* convert_args */,
+    Cardinal                   /* num_args */,
+    _XtBoolean                 /* new_style */,
+    XtCacheType                        /* cache_type */,
+    XtDestructor               /* destructor */,
+    _XtBoolean                 /* global */
+);
+
+extern Boolean _XtConvert(
+    Widget                     /* widget */,
+    XrmRepresentation          /* from_type */,
+    XrmValuePtr                        /* from */,
+    XrmRepresentation          /* to_type */,
+    XrmValuePtr                        /* to */,
+    XtCacheRef*                        /* cache_ref_return */
+);
+
+void _XtConvertInitialize(void);
+
+_XFUNCPROTOEND
diff --git a/include/X11/Core.h b/include/X11/Core.h
new file mode 100644 (file)
index 0000000..08a86f6
--- /dev/null
@@ -0,0 +1,65 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifndef _XtCore_h
+#define _XtCore_h
+
+_XFUNCPROTOBEGIN
+
+typedef struct _WidgetClassRec *CoreWidgetClass;
+typedef struct _WidgetRec *CoreWidget;
+externalref WidgetClass coreWidgetClass;
+
+#ifndef VMS
+externalref WidgetClass widgetClass;
+
+#endif
+
+_XFUNCPROTOEND
+
+#endif /* _XtCore_h */
+/* DON'T ADD STUFF AFTER THIS #endif */
diff --git a/include/X11/CoreP.h b/include/X11/CoreP.h
new file mode 100644 (file)
index 0000000..a4cb16e
--- /dev/null
@@ -0,0 +1,170 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifndef XtCoreP_h
+#define XtCoreP_h
+
+#include <X11/Core.h>
+
+_XFUNCPROTOBEGIN
+
+externalref int _XtInheritTranslations;
+
+#define XtInheritTranslations  ((String) &_XtInheritTranslations)
+#define XtInheritRealize ((XtRealizeProc) _XtInherit)
+#define XtInheritResize ((XtWidgetProc) _XtInherit)
+#define XtInheritExpose ((XtExposeProc) _XtInherit)
+#define XtInheritSetValuesAlmost ((XtAlmostProc) _XtInherit)
+#define XtInheritAcceptFocus ((XtAcceptFocusProc) _XtInherit)
+#define XtInheritQueryGeometry ((XtGeometryHandler) _XtInherit)
+#define XtInheritDisplayAccelerator ((XtStringProc) _XtInherit)
+
+/***************************************************************
+ * Widget Core Data Structures
+ *
+ *
+ **************************************************************/
+
+typedef struct _CorePart {
+    Widget         self;               /* pointer to widget itself          */
+    WidgetClass            widget_class;       /* pointer to Widget's ClassRec      */
+    Widget         parent;             /* parent widget                     */
+    XrmName         xrm_name;          /* widget resource name quarkified   */
+    Boolean         being_destroyed;   /* marked for destroy                */
+    XtCallbackList  destroy_callbacks; /* who to call when widget destroyed */
+    XtPointer       constraints;        /* constraint record                 */
+    Position        x, y;              /* window position                   */
+    Dimension       width, height;     /* window dimensions                 */
+    Dimension       border_width;      /* window border width               */
+    Boolean         managed;            /* is widget geometry managed?       */
+    Boolean        sensitive;          /* is widget sensitive to user events*/
+    Boolean         ancestor_sensitive;        /* are all ancestors sensitive?      */
+    XtEventTable    event_table;       /* private to event dispatcher       */
+    XtTMRec        tm;                 /* translation management            */
+    XtTranslations  accelerators;       /* accelerator translations          */
+    Pixel          border_pixel;       /* window border pixel               */
+    Pixmap          border_pixmap;     /* window border pixmap or NULL      */
+    WidgetList      popup_list;         /* list of popups                    */
+    Cardinal        num_popups;         /* how many popups                   */
+    String          name;              /* widget resource name              */
+    Screen         *screen;            /* window's screen                   */
+    Colormap        colormap;           /* colormap                          */
+    Window         window;             /* window ID                         */
+    Cardinal        depth;             /* number of planes in window        */
+    Pixel          background_pixel;   /* window background pixel           */
+    Pixmap          background_pixmap; /* window background pixmap or NULL  */
+    Boolean         visible;           /* is window mapped and not occluded?*/
+    Boolean        mapped_when_managed;/* map window if it's managed?       */
+} CorePart;
+
+typedef struct _WidgetRec {
+    CorePart    core;
+ } WidgetRec, CoreRec;
+
+
+
+/******************************************************************
+ *
+ * Core Class Structure. Widgets, regardless of their class, will have
+ * these fields.  All widgets of a given class will have the same values
+ * for these fields.  Widgets of a given class may also have additional
+ * common fields.  These additional fields are included in incremental
+ * class structures, such as CommandClass.
+ *
+ * The fields that are specific to this subclass, as opposed to fields that
+ * are part of the superclass, are called "subclass fields" below.  Many
+ * procedures are responsible only for the subclass fields, and not for
+ * any superclass fields.
+ *
+ ********************************************************************/
+
+typedef struct _CoreClassPart {
+    WidgetClass     superclass;                /* pointer to superclass ClassRec   */
+    String          class_name;                /* widget resource class name       */
+    Cardinal        widget_size;       /* size in bytes of widget record   */
+    XtProc         class_initialize;   /* class initialization proc        */
+    XtWidgetClassProc class_part_initialize; /* dynamic initialization     */
+    XtEnum          class_inited;       /* has class been initialized?      */
+    XtInitProc      initialize;                /* initialize subclass fields       */
+    XtArgsProc      initialize_hook;    /* notify that initialize called    */
+    XtRealizeProc   realize;           /* XCreateWindow for widget         */
+    XtActionList    actions;           /* widget semantics name to proc map */
+    Cardinal       num_actions;        /* number of entries in actions     */
+    XtResourceList  resources;         /* resources for subclass fields    */
+    Cardinal        num_resources;      /* number of entries in resources   */
+    XrmClass        xrm_class;         /* resource class quarkified        */
+    Boolean         compress_motion;    /* compress MotionNotify for widget */
+    XtEnum          compress_exposure;  /* compress Expose events for widget*/
+    Boolean         compress_enterleave;/* compress enter and leave events  */
+    Boolean         visible_interest;   /* select for VisibilityNotify      */
+    XtWidgetProc    destroy;           /* free data for subclass pointers  */
+    XtWidgetProc    resize;            /* geom manager changed widget size */
+    XtExposeProc    expose;            /* rediplay window                  */
+    XtSetValuesFunc set_values;                /* set subclass resource values     */
+    XtArgsFunc      set_values_hook;    /* notify that set_values called    */
+    XtAlmostProc    set_values_almost;  /* set_values got "Almost" geo reply */
+    XtArgsProc      get_values_hook;    /* notify that get_values called    */
+    XtAcceptFocusProc accept_focus;     /* assign input focus to widget     */
+    XtVersionType   version;           /* version of intrinsics used       */
+    XtPointer       callback_private;   /* list of callback offsets       */
+    String          tm_table;           /* state machine                    */
+    XtGeometryHandler query_geometry;  /* return preferred geometry        */
+    XtStringProc    display_accelerator;/* display your accelerator        */
+    XtPointer      extension;          /* pointer to extension record      */
+ } CoreClassPart;
+
+typedef struct _WidgetClassRec {
+    CoreClassPart core_class;
+} WidgetClassRec, CoreClassRec;
+
+externalref WidgetClassRec widgetClassRec;
+#define coreClassRec widgetClassRec
+
+_XFUNCPROTOEND
+
+#endif /* _XtCoreP_h */
+/* DON'T ADD STUFF AFTER THIS #endif */
diff --git a/include/X11/CreateI.h b/include/X11/CreateI.h
new file mode 100644 (file)
index 0000000..e00ba65
--- /dev/null
@@ -0,0 +1,42 @@
+#ifndef _XtcreateI_h
+#define _XtcreateI_h
+
+_XFUNCPROTOBEGIN
+
+extern Widget _XtCreateWidget(String name, WidgetClass widget_class,
+                             Widget parent, ArgList args, Cardinal num_args,
+                             XtTypedArgList typed_args,
+                             Cardinal num_typed_args);
+extern Widget _XtCreatePopupShell(String name, WidgetClass widget_class,
+                                 Widget parent, ArgList args,
+                                 Cardinal num_args, XtTypedArgList typed_args,
+                                 Cardinal num_typed_args);
+extern Widget _XtAppCreateShell(String name, String class,
+                               WidgetClass widget_class, Display *display,
+                               ArgList args, Cardinal num_args,
+                               XtTypedArgList typed_args,
+                               Cardinal num_typed_args);
+extern Widget _XtCreateHookObj(Screen *screen);
+
+_XFUNCPROTOEND
+
+#include <stdarg.h>
+
+_XFUNCPROTOBEGIN
+
+/* VarCreate.c */
+extern Widget _XtVaOpenApplication(XtAppContext *app_context_return,
+                       _Xconst char* application_class,
+                       XrmOptionDescList options, Cardinal num_options,
+                       int *argc_in_out, String *argv_in_out,
+                       String *fallback_resources, WidgetClass widget_class,
+                       va_list var_args);
+extern Widget _XtVaAppInitialize(XtAppContext *app_context_return,
+                       _Xconst char* application_class,
+                       XrmOptionDescList options, Cardinal num_options,
+                       int *argc_in_out, String *argv_in_out,
+                       String *fallback_resources, va_list var_args);
+
+_XFUNCPROTOEND
+
+#endif /* _XtcreateI_h */
diff --git a/include/X11/EventI.h b/include/X11/EventI.h
new file mode 100644 (file)
index 0000000..4aae5af
--- /dev/null
@@ -0,0 +1,134 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+ * Event.h - exported types and functions for toolkit event handler
+ *
+ * Author:     Charles Haynes
+ *             Digital Equipment Corporation
+ *             Western Software Laboratory
+ * Date:       Sun Dec  6 1987
+ */
+
+#ifndef _Event_h_
+#define _Event_h_
+
+typedef struct _XtGrabRec  *XtGrabList;
+
+#include "PassivGraI.h"
+
+_XFUNCPROTOBEGIN
+
+extern void _XtEventInitialize(
+    void
+);
+
+typedef struct _XtEventRec {
+     XtEventTable      next;
+     EventMask         mask;   /*  also select_data count for RecExt */
+     XtEventHandler    proc;
+     XtPointer         closure;
+     unsigned int      select:1;
+     unsigned int      has_type_specifier:1;
+     unsigned int      async:1; /* not used, here for Digital extension? */
+} XtEventRec;
+
+typedef struct _XtGrabRec {
+    XtGrabList next;
+    Widget   widget;
+    unsigned int exclusive:1;
+    unsigned int spring_loaded:1;
+}XtGrabRec;
+
+typedef struct _BlockHookRec {
+    struct _BlockHookRec* next;
+    XtAppContext app;
+    XtBlockHookProc proc;
+    XtPointer closure;
+} BlockHookRec, *BlockHook;
+
+extern void _XtFreeEventTable(
+    XtEventTable*      /* event_table */
+);
+
+extern Boolean _XtOnGrabList(
+    Widget     /* widget */,
+    XtGrabRec* /* grabList */
+);
+
+extern void _XtRemoveAllInputs(
+    XtAppContext /* app */
+);
+
+extern void _XtRefreshMapping(
+    XEvent*    /* event */,
+    _XtBoolean /* dispatch */
+);
+
+extern void _XtSendFocusEvent(
+    Widget     /* child */,
+    int                /* type */);
+
+extern EventMask _XtConvertTypeToMask(
+    int                /* eventType */
+);
+
+/* EventUtil.c */
+extern Widget _XtFindRemapWidget(XEvent *event, Widget widget,
+                                EventMask mask, XtPerDisplayInput pdi);
+extern void _XtUngrabBadGrabs(XEvent *event, Widget widget,
+                                EventMask mask, XtPerDisplayInput pdi);
+extern void _XtFillAncestorList(Widget **listPtr, int *maxElemsPtr,
+                               int *numElemsPtr, Widget start,
+                               Widget breakWidget);
+
+/* NextEvent.c */
+extern Boolean XtAppPeekEvent_SkipTimer;
+
+_XFUNCPROTOEND
+
+#endif /* _Event_h_ */
diff --git a/include/X11/HookObjI.h b/include/X11/HookObjI.h
new file mode 100644 (file)
index 0000000..94c0cbb
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+
+Copyright 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifndef _XtHookObjI_h
+#define _XtHookObjI_h
+
+_XFUNCPROTOBEGIN
+
+/* This object is implementation-dependent and private to the library. */
+
+typedef struct _HookObjRec *HookObject;
+typedef struct _HookObjClassRec *HookObjectClass;
+
+externalref WidgetClass hookObjectClass;
+
+typedef struct _HookObjPart {
+    /* resources */
+    XtCallbackList createhook_callbacks;
+    XtCallbackList changehook_callbacks;
+    XtCallbackList confighook_callbacks;
+    XtCallbackList geometryhook_callbacks;
+    XtCallbackList destroyhook_callbacks;
+    WidgetList shells;
+    Cardinal num_shells;
+    /* private data */
+    Cardinal max_shells;
+    Screen* screen;
+}HookObjPart;
+
+typedef struct _HookObjRec {
+    ObjectPart object;
+    HookObjPart hooks;
+} HookObjRec;
+
+typedef struct _HookObjClassPart {
+    int unused;
+} HookObjClassPart;
+
+typedef struct _HookObjClassRec {
+    ObjectClassPart object_class;
+    HookObjClassPart hook_class;
+} HookObjClassRec;
+
+externalref HookObjClassRec hookObjClassRec;
+
+_XFUNCPROTOEND
+
+#endif /* ifndef _Xt_HookObjI_h */
+
+
diff --git a/include/X11/InitialI.h b/include/X11/InitialI.h
new file mode 100644 (file)
index 0000000..0827df0
--- /dev/null
@@ -0,0 +1,430 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifndef _XtinitialI_h
+#define _XtinitialI_h
+
+/****************************************************************
+ *
+ * Displays
+ *
+ ****************************************************************/
+
+#ifndef X_NOT_POSIX
+#ifdef _POSIX_SOURCE
+#include <limits.h>
+#else
+#define _POSIX_SOURCE
+#include <limits.h>
+#undef _POSIX_SOURCE
+#endif
+#endif
+#ifndef PATH_MAX
+#ifdef WIN32
+#define PATH_MAX 512
+#else
+#include <sys/param.h>
+#endif
+#ifndef PATH_MAX
+#ifdef MAXPATHLEN
+#define PATH_MAX MAXPATHLEN
+#else
+#define PATH_MAX 1024
+#endif
+#endif
+#endif
+
+#include <X11/Xos.h>
+#include <X11/Xpoll.h>
+
+_XFUNCPROTOBEGIN
+
+typedef struct _TimerEventRec {
+        struct timeval        te_timer_value;
+       struct _TimerEventRec *te_next;
+       XtTimerCallbackProc   te_proc;
+       XtAppContext          app;
+       XtPointer             te_closure;
+} TimerEventRec;
+
+typedef struct _InputEvent {
+       XtInputCallbackProc   ie_proc;
+       XtPointer             ie_closure;
+       struct _InputEvent    *ie_next;
+       struct _InputEvent    *ie_oq;
+       XtAppContext          app;
+       int                   ie_source;
+       XtInputMask           ie_condition;
+} InputEvent;
+
+typedef struct _SignalEventRec {
+       XtSignalCallbackProc  se_proc;
+       XtPointer             se_closure;
+       struct _SignalEventRec *se_next;
+       XtAppContext          app;
+       Boolean               se_notice;
+} SignalEventRec;
+
+typedef struct _WorkProcRec {
+       XtWorkProc proc;
+       XtPointer closure;
+       struct _WorkProcRec *next;
+       XtAppContext app;
+} WorkProcRec;
+
+
+typedef struct
+{
+#ifndef USE_POLL
+       fd_set rmask;
+       fd_set wmask;
+       fd_set emask;
+#endif
+       int     nfds;
+} FdStruct;
+
+typedef struct _LangProcRec {
+    XtLanguageProc     proc;
+    XtPointer          closure;
+} LangProcRec;
+
+typedef struct _ProcessContextRec {
+    XtAppContext       defaultAppContext;
+    XtAppContext       appContextList;
+    ConverterTable     globalConverterTable;
+    LangProcRec                globalLangProcRec;
+} ProcessContextRec, *ProcessContext;
+
+typedef struct {
+    char*      start;
+    char*      current;
+    int                bytes_remaining;
+} Heap;
+
+typedef struct _DestroyRec DestroyRec;
+
+
+typedef struct _XtAppStruct {
+    XtAppContext next;         /* link to next app in process context */
+    ProcessContext process;    /* back pointer to our process context */
+    InternalCallbackList destroy_callbacks;
+    Display **list;
+    TimerEventRec *timerQueue;
+    WorkProcRec *workQueue;
+    InputEvent **input_list;
+    InputEvent *outstandingQueue;
+    SignalEventRec *signalQueue;
+    XrmDatabase errorDB;
+    XtErrorMsgHandler errorMsgHandler, warningMsgHandler;
+    XtErrorHandler errorHandler, warningHandler;
+    struct _ActionListRec *action_table;
+    ConverterTable converterTable;
+    unsigned long selectionTimeout;
+    FdStruct fds;
+    short count;                       /* num of assigned entries in list */
+    short max;                         /* allocate size of list */
+    short last;
+    short input_count;
+    short input_max;                   /* elts input_list init'd with */
+    Boolean sync, being_destroyed, error_inited;
+#ifndef NO_IDENTIFY_WINDOWS
+    Boolean identify_windows;          /* debugging hack */
+#endif
+    Heap heap;
+    String * fallback_resources;       /* Set by XtAppSetFallbackResources. */
+    struct _ActionHookRec* action_hook_list;
+    struct _BlockHookRec* block_hook_list;
+    int destroy_list_size;             /* state data for 2-phase destroy */
+    int destroy_count;
+    int dispatch_level;
+    DestroyRec* destroy_list;
+    Widget in_phase2_destroy;
+    LangProcRec langProcRec;
+    struct _TMBindCacheRec * free_bindings;
+    String display_name_tried;
+    Display **dpy_destroy_list;
+    int dpy_destroy_count;
+    Boolean exit_flag;
+    Boolean rebuild_fdlist;
+#ifdef XTHREADS
+    LockPtr lock_info;
+    ThreadAppProc lock;
+    ThreadAppProc unlock;
+    ThreadAppYieldLockProc yield_lock;
+    ThreadAppRestoreLockProc restore_lock;
+    ThreadAppProc free_lock;
+#endif
+} XtAppStruct;
+
+extern void _XtHeapInit(Heap* heap);
+extern void _XtHeapFree(Heap* heap);
+
+#ifdef XTTRACEMEMORY
+
+
+extern char *_XtHeapMalloc(
+    Heap*      /* heap */,
+    Cardinal   /* size */,
+    char *     /* file */,
+    int                /* line */
+);
+
+#define _XtHeapAlloc(heap,bytes) _XtHeapMalloc(heap, bytes, __FILE__, __LINE__)
+
+#else /* XTTRACEMEMORY */
+
+extern char* _XtHeapAlloc(
+    Heap*      /* heap */,
+    Cardinal   /* size */
+);
+
+#endif /* XTTRACEMEMORY */
+
+extern void _XtSetDefaultErrorHandlers(
+    XtErrorMsgHandler* /* errMsg */,
+    XtErrorMsgHandler* /* warnMsg */,
+    XtErrorHandler*    /* err */,
+    XtErrorHandler*    /* warn */
+);
+
+extern void _XtSetDefaultSelectionTimeout(
+    unsigned long* /* timeout */
+);
+
+extern XtAppContext _XtDefaultAppContext(
+    void
+);
+
+extern ProcessContext _XtGetProcessContext(
+    void
+);
+
+Display *
+_XtAppInit(
+    XtAppContext*      /* app_context_return */,
+    String             /* application_class */,
+    XrmOptionDescRec*  /* options */,
+    Cardinal           /* num_options */,
+    int*               /* argc_in_out */,
+    String**           /* argv_in_out */,
+    String*            /* fallback_resources */
+);
+
+extern void _XtDestroyAppContexts(
+    void
+);
+
+extern void _XtCloseDisplays(
+    XtAppContext       /* app */
+);
+
+extern int _XtAppDestroyCount;
+
+extern int _XtWaitForSomething(
+    XtAppContext       /* app */,
+    _XtBoolean                 /* ignoreEvents */,
+    _XtBoolean                 /* ignoreTimers */,
+    _XtBoolean                 /* ignoreInputs */,
+    _XtBoolean         /* ignoreSignals */,
+    _XtBoolean                 /* block */,
+#ifdef XTHREADS
+    _XtBoolean         /* drop_lock */,
+#endif
+    unsigned long*     /* howlong */
+);
+
+typedef struct _CaseConverterRec *CaseConverterPtr;
+typedef struct _CaseConverterRec {
+    KeySym             start;          /* first KeySym valid in converter */
+    KeySym             stop;           /* last KeySym valid in converter */
+    XtCaseProc         proc;           /* case converter function */
+    CaseConverterPtr   next;           /* next converter record */
+} CaseConverterRec;
+
+typedef struct _ExtensionSelectorRec {
+    XtExtensionSelectProc proc;
+    int min, max;
+    XtPointer client_data;
+} ExtSelectRec;
+
+typedef struct _XtPerDisplayStruct {
+    InternalCallbackList destroy_callbacks;
+    Region region;
+    CaseConverterPtr case_cvt;         /* user-registered case converters */
+    XtKeyProc defaultKeycodeTranslator;
+    XtAppContext appContext;
+    unsigned long keysyms_serial;      /* for tracking MappingNotify events */
+    KeySym *keysyms;                   /* keycode to keysym table */
+    int keysyms_per_keycode;           /* number of keysyms for each keycode*/
+    int min_keycode, max_keycode;      /* range of keycodes */
+    KeySym *modKeysyms;                /* keysym values for modToKeysysm */
+    ModToKeysymTable *modsToKeysyms;   /* modifiers to Keysysms index table*/
+    unsigned char isModifier[32];      /* key-is-modifier-p bit table */
+    KeySym lock_meaning;              /* Lock modifier meaning */
+    Modifiers mode_switch;            /* keyboard group modifiers */
+    Modifiers num_lock;                       /* keyboard numlock modifiers */
+    Boolean being_destroyed;
+    Boolean rv;                               /* reverse_video resource */
+    XrmName name;                     /* resolved app name */
+    XrmClass class;                   /* application class */
+    Heap heap;
+    struct _GCrec *GClist;            /* support for XtGetGC */
+    Drawable **pixmap_tab;             /* ditto for XtGetGC */
+    String language;                  /* XPG language string */
+    XEvent last_event;                /* last event dispatched */
+    Time last_timestamp;              /* from last event dispatched */
+    int multi_click_time;             /* for XtSetMultiClickTime */
+    struct _TMKeyContextRec* tm_context;     /* for XtGetActionKeysym */
+    InternalCallbackList mapping_callbacks;  /* special case for TM */
+    XtPerDisplayInputRec pdi;         /* state for modal grabs & kbd focus */
+    struct _WWTable *WWtable;         /* window to widget table */
+    XrmDatabase *per_screen_db;        /* per screen resource databases */
+    XrmDatabase cmd_db;                       /* db from command line, if needed */
+    XrmDatabase server_db;            /* resource property else .Xdefaults */
+    XtEventDispatchProc* dispatcher_list;
+    ExtSelectRec* ext_select_list;
+    int ext_select_count;
+    Widget hook_object;
+#ifndef X_NO_RESOURCE_CONFIGURATION_MANAGEMENT
+    Atom rcm_init;                     /* ResConfig - initialize */
+    Atom rcm_data;                     /* ResConfig - data atom */
+#endif
+} XtPerDisplayStruct, *XtPerDisplay;
+
+typedef struct _PerDisplayTable {
+       Display *dpy;
+       XtPerDisplayStruct perDpy;
+       struct _PerDisplayTable *next;
+} PerDisplayTable, *PerDisplayTablePtr;
+
+extern PerDisplayTablePtr _XtperDisplayList;
+
+extern XtPerDisplay _XtSortPerDisplayList(
+    Display* /* dpy */
+);
+
+extern XtPerDisplay _XtGetPerDisplay(
+    Display*           /* dpy */
+);
+
+extern XtPerDisplayInputRec* _XtGetPerDisplayInput(
+    Display*           /* dpy */
+);
+
+#if 0
+#ifdef DEBUG
+#define _XtGetPerDisplay(display) \
+    ((_XtperDisplayList != NULL && (_XtperDisplayList->dpy == (display))) \
+     ? &_XtperDisplayList->perDpy \
+     : _XtSortPerDisplayList(display))
+#define _XtGetPerDisplayInput(display) \
+    ((_XtperDisplayList != NULL && (_XtperDisplayList->dpy == (display))) \
+     ? &_XtperDisplayList->perDpy.pdi \
+     : &_XtSortPerDisplayList(display)->pdi)
+#else
+#define _XtGetPerDisplay(display) \
+    ((_XtperDisplayList->dpy == (display)) \
+     ? &_XtperDisplayList->perDpy \
+     : _XtSortPerDisplayList(display))
+#define _XtGetPerDisplayInput(display) \
+    ((_XtperDisplayList->dpy == (display)) \
+     ? &_XtperDisplayList->perDpy.pdi \
+     : &_XtSortPerDisplayList(display)->pdi)
+#endif /*DEBUG*/
+#endif
+
+extern void _XtDisplayInitialize(
+    Display*           /* dpy */,
+    XtPerDisplay       /* pd */,
+    _Xconst char*      /* name */,
+    XrmOptionDescRec*  /* urlist */,
+    Cardinal           /* num_urs */,
+    int*               /* argc */,
+    char**             /* argv */
+);
+
+extern void _XtCacheFlushTag(
+    XtAppContext /* app */,
+    XtPointer   /* tag */
+);
+
+extern void _XtFreeActions(
+    struct _ActionListRec* /* action_table */
+);
+
+extern void _XtDoPhase2Destroy(
+    XtAppContext /* app */,
+    int                 /* dispatch_level */
+);
+
+extern void _XtDoFreeBindings(
+    XtAppContext /* app */
+);
+
+extern void _XtExtensionSelect(
+    Widget /* widget */
+);
+
+#define _XtSafeToDestroy(app) ((app)->dispatch_level == 0)
+
+extern void _XtAllocWWTable(
+    XtPerDisplay pd
+);
+
+extern void _XtFreeWWTable(
+    XtPerDisplay pd
+);
+
+extern String _XtGetUserName(String dest, int len);
+extern XrmDatabase _XtPreparseCommandLine(XrmOptionDescRec *urlist,
+                       Cardinal num_urs, int argc, String *argv,
+                       String *applName, String *displayName,
+                       String *language);
+
+_XFUNCPROTOEND
+
+#endif /* _XtinitialI_h */
diff --git a/include/X11/Intrinsic.h b/include/X11/Intrinsic.h
new file mode 100644 (file)
index 0000000..d09acad
--- /dev/null
@@ -0,0 +1,2595 @@
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
+
+                       All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifndef _XtIntrinsic_h
+#define _XtIntrinsic_h
+
+#include       <X11/Xlib.h>
+#include       <X11/Xutil.h>
+#include       <X11/Xresource.h>
+#include       <X11/Xfuncproto.h>
+#ifdef XT_BC
+#include <X11/Xos.h>           /* for R4 compatibility */
+#else
+#include <X11/Xosdefs.h>
+#include <string.h>            /* for XtNewString */
+#endif /* XT_BC else */
+
+#define XtSpecificationRelease 6
+
+typedef char *String;
+
+/* We do this in order to get "const" declarations to work right.  We
+ * use _XtString instead of String so that C++ applications can
+ * #define String to something else if they choose, to avoid conflicts
+ * with other C++ libraries.
+ */
+#define _XtString char*
+
+/* _Xt names are private to Xt implementation, do not use in client code */
+#if NeedWidePrototypes
+#define _XtBoolean     int
+#define _XtDimension   unsigned int
+#define _XtKeyCode     unsigned int
+#define _XtPosition    int
+#define _XtXtEnum      unsigned int
+#else
+#define _XtBoolean     Boolean
+#define _XtDimension   Dimension
+#define _XtKeyCode     KeyCode
+#define _XtPosition    Position
+#define _XtXtEnum      XtEnum
+#endif /* NeedWidePrototypes */
+
+#include <stddef.h>
+
+#ifdef VMS
+#define externalref globalref
+#define externaldef(psect) globaldef {"psect"} noshare
+#else
+#define externalref extern
+#define externaldef(psect)
+#endif /* VMS */
+
+#ifndef FALSE
+#define FALSE 0
+#define TRUE 1
+#endif
+
+#define XtNumber(arr)          ((Cardinal) (sizeof(arr) / sizeof(arr[0])))
+
+typedef struct _WidgetRec *Widget;
+typedef Widget *WidgetList;
+typedef struct _WidgetClassRec *WidgetClass;
+typedef struct _CompositeRec *CompositeWidget;
+typedef struct _XtActionsRec *XtActionList;
+typedef struct _XtEventRec *XtEventTable;
+
+typedef struct _XtAppStruct *XtAppContext;
+typedef unsigned long  XtValueMask;
+typedef unsigned long  XtIntervalId;
+typedef unsigned long  XtInputId;
+typedef unsigned long  XtWorkProcId;
+typedef unsigned long  XtSignalId;
+typedef unsigned int   XtGeometryMask;
+typedef unsigned long  XtGCMask;   /* Mask of values that are used by widget*/
+typedef unsigned long  Pixel;      /* Index into colormap              */
+typedef int            XtCacheType;
+#define                        XtCacheNone       0x001
+#define                        XtCacheAll        0x002
+#define                        XtCacheByDisplay  0x003
+#define                        XtCacheRefCount   0x100
+
+/****************************************************************
+ *
+ * System Dependent Definitions; see spec for specific range
+ * requirements.  Do not assume every implementation uses the
+ * same base types!
+ *
+ *
+ * XtArgVal ought to be a union of XtPointer, char *, long, int *, and proc *
+ * but casting to union types is not really supported.
+ *
+ * So the typedef for XtArgVal should be chosen such that
+ *
+ *     sizeof (XtArgVal) >=    sizeof(XtPointer)
+ *                             sizeof(char *)
+ *                             sizeof(long)
+ *                             sizeof(int *)
+ *                             sizeof(proc *)
+ *
+ * ArgLists rely heavily on the above typedef.
+ *
+ ****************************************************************/
+#ifdef CRAY
+typedef long           Boolean;
+typedef char*          XtArgVal;
+typedef long           XtEnum;
+#else
+typedef char           Boolean;
+typedef long           XtArgVal;
+typedef unsigned char  XtEnum;
+#endif
+
+typedef unsigned int   Cardinal;
+typedef unsigned short Dimension;  /* Size in pixels                   */
+typedef short          Position;   /* Offset from 0 coordinate         */
+
+typedef void*          XtPointer;
+
+/* The type Opaque is NOT part of the Xt standard, do NOT use it. */
+/* (It remains here only for backward compatibility.) */
+typedef XtPointer      Opaque;
+
+#include <X11/Core.h>
+#include <X11/Composite.h>
+#include <X11/Constraint.h>
+#include <X11/Object.h>
+#include <X11/RectObj.h>
+
+typedef struct _TranslationData *XtTranslations;
+typedef struct _TranslationData *XtAccelerators;
+typedef unsigned int Modifiers;
+
+typedef void (*XtActionProc)(
+    Widget             /* widget */,
+    XEvent*            /* event */,
+    String*            /* params */,
+    Cardinal*          /* num_params */
+);
+
+typedef XtActionProc* XtBoundActions;
+
+typedef struct _XtActionsRec{
+    String      string;
+    XtActionProc proc;
+} XtActionsRec;
+
+typedef enum {
+/* address mode                parameter representation    */
+/* ------------                ------------------------    */
+    XtAddress,         /* address                  */
+    XtBaseOffset,      /* offset                   */
+    XtImmediate,       /* constant                 */
+    XtResourceString,  /* resource name string     */
+    XtResourceQuark,   /* resource name quark      */
+    XtWidgetBaseOffset,        /* offset from ancestor     */
+    XtProcedureArg     /* procedure to invoke      */
+} XtAddressMode;
+
+typedef struct {
+    XtAddressMode   address_mode;
+    XtPointer      address_id;
+    Cardinal       size;
+} XtConvertArgRec, *XtConvertArgList;
+
+typedef void (*XtConvertArgProc)(
+    Widget             /* widget */,
+    Cardinal*          /* size */,
+    XrmValue*          /* value */
+);
+
+typedef struct {
+    XtGeometryMask request_mode;
+    Position x, y;
+    Dimension width, height, border_width;
+    Widget sibling;
+    int stack_mode;   /* Above, Below, TopIf, BottomIf, Opposite, DontChange */
+} XtWidgetGeometry;
+
+/* Additions to Xlib geometry requests: ask what would happen, don't do it */
+#define XtCWQueryOnly  (1 << 7)
+
+/* Additions to Xlib stack modes: don't change stack order */
+#define XtSMDontChange 5
+
+typedef void (*XtConverter)( /* obsolete */
+    XrmValue*          /* args */,
+    Cardinal*          /* num_args */,
+    XrmValue*          /* from */,
+    XrmValue*          /* to */
+);
+
+typedef Boolean (*XtTypeConverter)(
+    Display*           /* dpy */,
+    XrmValue*          /* args */,
+    Cardinal*          /* num_args */,
+    XrmValue*          /* from */,
+    XrmValue*          /* to */,
+    XtPointer*         /* converter_data */
+);
+
+typedef void (*XtDestructor)(
+    XtAppContext       /* app */,
+    XrmValue*          /* to */,
+    XtPointer          /* converter_data */,
+    XrmValue*          /* args */,
+    Cardinal*          /* num_args */
+);
+
+typedef Opaque XtCacheRef;
+
+typedef Opaque XtActionHookId;
+
+typedef void (*XtActionHookProc)(
+    Widget             /* w */,
+    XtPointer          /* client_data */,
+    String             /* action_name */,
+    XEvent*            /* event */,
+    String*            /* params */,
+    Cardinal*          /* num_params */
+);
+
+typedef unsigned long XtBlockHookId;
+
+typedef void (*XtBlockHookProc)(
+    XtPointer          /* client_data */
+);
+
+typedef void (*XtKeyProc)(
+    Display*           /* dpy */,
+    _XtKeyCode                 /* keycode */,
+    Modifiers          /* modifiers */,
+    Modifiers*         /* modifiers_return */,
+    KeySym*            /* keysym_return */
+);
+
+typedef void (*XtCaseProc)(
+    Display*           /* display */,
+    KeySym             /* keysym */,
+    KeySym*            /* lower_return */,
+    KeySym*            /* upper_return */
+);
+
+typedef void (*XtEventHandler)(
+    Widget             /* widget */,
+    XtPointer          /* closure */,
+    XEvent*            /* event */,
+    Boolean*           /* continue_to_dispatch */
+);
+typedef unsigned long EventMask;
+
+typedef enum {XtListHead, XtListTail } XtListPosition;
+
+typedef unsigned long  XtInputMask;
+#define XtInputNoneMask                0L
+#define XtInputReadMask                (1L<<0)
+#define XtInputWriteMask       (1L<<1)
+#define XtInputExceptMask      (1L<<2)
+
+typedef void (*XtTimerCallbackProc)(
+    XtPointer          /* closure */,
+    XtIntervalId*      /* id */
+);
+
+typedef void (*XtInputCallbackProc)(
+    XtPointer          /* closure */,
+    int*               /* source */,
+    XtInputId*         /* id */
+);
+
+typedef void (*XtSignalCallbackProc)(
+    XtPointer          /* closure */,
+    XtSignalId*                /* id */
+);
+
+typedef struct {
+    String     name;
+    XtArgVal   value;
+} Arg, *ArgList;
+
+typedef XtPointer      XtVarArgsList;
+
+typedef void (*XtCallbackProc)(
+    Widget             /* widget */,
+    XtPointer          /* closure */,  /* data the application registered */
+    XtPointer          /* call_data */ /* callback specific data */
+);
+
+typedef struct _XtCallbackRec {
+    XtCallbackProc  callback;
+    XtPointer      closure;
+} XtCallbackRec, *XtCallbackList;
+
+typedef enum {
+       XtCallbackNoList,
+       XtCallbackHasNone,
+       XtCallbackHasSome
+} XtCallbackStatus;
+
+typedef enum  {
+    XtGeometryYes,       /* Request accepted. */
+    XtGeometryNo,        /* Request denied. */
+    XtGeometryAlmost,    /* Request denied, but willing to take replyBox. */
+    XtGeometryDone       /* Request accepted and done. */
+} XtGeometryResult;
+
+typedef enum {XtGrabNone, XtGrabNonexclusive, XtGrabExclusive} XtGrabKind;
+
+typedef struct {
+    Widget  shell_widget;
+    Widget  enable_widget;
+} XtPopdownIDRec, *XtPopdownID;
+
+typedef struct _XtResource {
+    String     resource_name;  /* Resource name                            */
+    String     resource_class; /* Resource class                           */
+    String     resource_type;  /* Representation type desired              */
+    Cardinal   resource_size;  /* Size in bytes of representation          */
+    Cardinal   resource_offset;/* Offset from base to put resource value   */
+    String     default_type;   /* representation type of specified default */
+    XtPointer  default_addr;   /* Address of default resource              */
+} XtResource, *XtResourceList;
+
+typedef void (*XtResourceDefaultProc)(
+    Widget     /* widget */,
+    int                /* offset */,
+    XrmValue*  /* value */
+);
+
+typedef String (*XtLanguageProc)(
+    Display*   /* dpy */,
+    String     /* xnl */,
+    XtPointer  /* client_data */
+);
+
+typedef void (*XtErrorMsgHandler)(
+    String             /* name */,
+    String             /* type */,
+    String             /* class */,
+    String             /* default */,
+    String*            /* params */,
+    Cardinal*          /* num_params */
+);
+
+typedef void (*XtErrorHandler)(
+  String               /* msg */
+);
+
+typedef void (*XtCreatePopupChildProc)(
+    Widget     /* shell */
+);
+
+typedef Boolean (*XtWorkProc)(
+    XtPointer          /* closure */   /* data the application registered */
+);
+
+typedef struct {
+    char match;
+    String substitution;
+} SubstitutionRec, *Substitution;
+
+typedef Boolean (*XtFilePredicate)(
+   String /* filename */
+);
+
+typedef XtPointer XtRequestId;
+
+typedef Boolean (*XtConvertSelectionProc)(
+    Widget             /* widget */,
+    Atom*              /* selection */,
+    Atom*              /* target */,
+    Atom*              /* type_return */,
+    XtPointer*         /* value_return */,
+    unsigned long*     /* length_return */,
+    int*               /* format_return */
+);
+
+typedef void (*XtLoseSelectionProc)(
+    Widget             /* widget */,
+    Atom*              /* selection */
+);
+
+typedef void (*XtSelectionDoneProc)(
+    Widget             /* widget */,
+    Atom*              /* selection */,
+    Atom*              /* target */
+);
+
+typedef void (*XtSelectionCallbackProc)(
+    Widget             /* widget */,
+    XtPointer          /* closure */,
+    Atom*              /* selection */,
+    Atom*              /* type */,
+    XtPointer          /* value */,
+    unsigned long*     /* length */,
+    int*               /* format */
+);
+
+typedef void (*XtLoseSelectionIncrProc)(
+    Widget             /* widget */,
+    Atom*              /* selection */,
+    XtPointer          /* client_data */
+);
+
+typedef void (*XtSelectionDoneIncrProc)(
+    Widget             /* widget */,
+    Atom*              /* selection */,
+    Atom*              /* target */,
+    XtRequestId*       /* receiver_id */,
+    XtPointer          /* client_data */
+);
+
+typedef Boolean (*XtConvertSelectionIncrProc)(
+    Widget             /* widget */,
+    Atom*              /* selection */,
+    Atom*              /* target */,
+    Atom*              /* type */,
+    XtPointer*         /* value */,
+    unsigned long*     /* length */,
+    int*               /* format */,
+    unsigned long*     /* max_length */,
+    XtPointer          /* client_data */,
+    XtRequestId*       /* receiver_id */
+);
+
+typedef void (*XtCancelConvertSelectionProc)(
+    Widget             /* widget */,
+    Atom*              /* selection */,
+    Atom*              /* target */,
+    XtRequestId*       /* receiver_id */,
+    XtPointer          /* client_data */
+);
+
+typedef Boolean (*XtEventDispatchProc)(
+    XEvent*            /* event */
+);
+
+typedef void (*XtExtensionSelectProc)(
+    Widget             /* widget */,
+    int*               /* event_types */,
+    XtPointer*         /* select_data */,
+    int                        /* count */,
+    XtPointer          /* client_data */
+);
+
+/***************************************************************
+ *
+ * Exported Interfaces
+ *
+ ****************************************************************/
+
+_XFUNCPROTOBEGIN
+
+extern Boolean XtConvertAndStore(
+    Widget             /* widget */,
+    _Xconst _XtString  /* from_type */,
+    XrmValue*          /* from */,
+    _Xconst _XtString  /* to_type */,
+    XrmValue*          /* to_in_out */
+);
+
+extern Boolean XtCallConverter(
+    Display*           /* dpy */,
+    XtTypeConverter    /* converter */,
+    XrmValuePtr        /* args */,
+    Cardinal           /* num_args */,
+    XrmValuePtr        /* from */,
+    XrmValue*          /* to_in_out */,
+    XtCacheRef*                /* cache_ref_return */
+);
+
+extern Boolean XtDispatchEvent(
+    XEvent*            /* event */
+);
+
+extern Boolean XtCallAcceptFocus(
+    Widget             /* widget */,
+    Time*              /* time */
+);
+
+extern Boolean XtPeekEvent( /* obsolete */
+    XEvent*            /* event_return */
+);
+
+extern Boolean XtAppPeekEvent(
+    XtAppContext       /* app_context */,
+    XEvent*            /* event_return */
+);
+
+extern Boolean XtIsSubclass(
+    Widget             /* widget */,
+    WidgetClass        /* widgetClass */
+);
+
+extern Boolean XtIsObject(
+    Widget             /* object */
+);
+
+extern Boolean _XtCheckSubclassFlag( /* implementation-private */
+    Widget             /* object */,
+    _XtXtEnum          /* type_flag */
+);
+
+extern Boolean _XtIsSubclassOf( /* implementation-private */
+    Widget             /* object */,
+    WidgetClass                /* widget_class */,
+    WidgetClass                /* flag_class */,
+    _XtXtEnum          /* type_flag */
+);
+
+extern Boolean XtIsManaged(
+    Widget             /* rectobj */
+);
+
+extern Boolean XtIsRealized(
+    Widget             /* widget */
+);
+
+extern Boolean XtIsSensitive(
+    Widget             /* widget */
+);
+
+extern Boolean XtOwnSelection(
+    Widget             /* widget */,
+    Atom               /* selection */,
+    Time               /* time */,
+    XtConvertSelectionProc /* convert */,
+    XtLoseSelectionProc        /* lose */,
+    XtSelectionDoneProc /* done */
+);
+
+extern Boolean XtOwnSelectionIncremental(
+    Widget             /* widget */,
+    Atom               /* selection */,
+    Time               /* time */,
+    XtConvertSelectionIncrProc /* convert_callback */,
+    XtLoseSelectionIncrProc    /* lose_callback */,
+    XtSelectionDoneIncrProc    /* done_callback */,
+    XtCancelConvertSelectionProc /* cancel_callback */,
+    XtPointer          /* client_data */
+);
+
+extern XtGeometryResult XtMakeResizeRequest(
+    Widget             /* widget */,
+    _XtDimension       /* width */,
+    _XtDimension       /* height */,
+    Dimension*         /* width_return */,
+    Dimension*         /* height_return */
+);
+
+extern void XtTranslateCoords(
+    Widget             /* widget */,
+    _XtPosition                /* x */,
+    _XtPosition                /* y */,
+    Position*          /* rootx_return */,
+    Position*          /* rooty_return */
+);
+
+extern KeySym* XtGetKeysymTable(
+    Display*           /* dpy */,
+    KeyCode*           /* min_keycode_return */,
+    int*               /* keysyms_per_keycode_return */
+);
+
+extern void XtKeysymToKeycodeList(
+    Display*           /* dpy */,
+    KeySym             /* keysym */,
+    KeyCode**          /* keycodes_return */,
+    Cardinal*          /* keycount_return */
+);
+
+extern void XtStringConversionWarning( /* obsolete */
+    _Xconst _XtString  /* from_value */,
+    _Xconst _XtString  /* to_type */
+);
+
+extern void XtDisplayStringConversionWarning(
+    Display*           /* dpy */,
+    _Xconst _XtString  /* from_value */,
+    _Xconst _XtString  /* to_type */
+);
+
+externalref XtConvertArgRec const colorConvertArgs[];
+externalref XtConvertArgRec const screenConvertArg[];
+
+extern void XtAppAddConverter( /* obsolete */
+    XtAppContext       /* app_context */,
+    _Xconst _XtString  /* from_type */,
+    _Xconst _XtString  /* to_type */,
+    XtConverter        /* converter */,
+    XtConvertArgList   /* convert_args */,
+    Cardinal           /* num_args */
+);
+
+extern void XtAddConverter( /* obsolete */
+    _Xconst _XtString  /* from_type */,
+    _Xconst _XtString  /* to_type */,
+    XtConverter        /* converter */,
+    XtConvertArgList   /* convert_args */,
+    Cardinal           /* num_args */
+);
+
+extern void XtSetTypeConverter(
+    _Xconst _XtString  /* from_type */,
+    _Xconst _XtString  /* to_type */,
+    XtTypeConverter    /* converter */,
+    XtConvertArgList   /* convert_args */,
+    Cardinal           /* num_args */,
+    XtCacheType        /* cache_type */,
+    XtDestructor       /* destructor */
+);
+
+extern void XtAppSetTypeConverter(
+    XtAppContext       /* app_context */,
+    _Xconst _XtString  /* from_type */,
+    _Xconst _XtString  /* to_type */,
+    XtTypeConverter    /* converter */,
+    XtConvertArgList   /* convert_args */,
+    Cardinal           /* num_args */,
+    XtCacheType        /* cache_type */,
+    XtDestructor       /* destructor */
+);
+
+extern void XtConvert( /* obsolete */
+    Widget             /* widget */,
+    _Xconst _XtString  /* from_type */,
+    XrmValue*          /* from */,
+    _Xconst _XtString  /* to_type */,
+    XrmValue*          /* to_return */
+);
+
+extern void XtDirectConvert( /* obsolete */
+    XtConverter        /* converter */,
+    XrmValuePtr        /* args */,
+    Cardinal           /* num_args */,
+    XrmValuePtr        /* from */,
+    XrmValue*          /* to_return */
+);
+
+/****************************************************************
+ *
+ * Translation Management
+ *
+ ****************************************************************/
+
+extern XtTranslations XtParseTranslationTable(
+    _Xconst _XtString  /* table */
+);
+
+extern XtAccelerators XtParseAcceleratorTable(
+    _Xconst _XtString  /* source */
+);
+
+extern void XtOverrideTranslations(
+    Widget             /* widget */,
+    XtTranslations     /* translations */
+);
+
+extern void XtAugmentTranslations(
+    Widget             /* widget */,
+    XtTranslations     /* translations */
+);
+
+extern void XtInstallAccelerators(
+    Widget             /* destination */,
+    Widget             /* source */
+);
+
+extern void XtInstallAllAccelerators(
+    Widget             /* destination */,
+    Widget             /* source */
+);
+
+extern void XtUninstallTranslations(
+    Widget             /* widget */
+);
+
+extern void XtAppAddActions(
+    XtAppContext       /* app_context */,
+    XtActionList       /* actions */,
+    Cardinal           /* num_actions */
+);
+
+extern void XtAddActions( /* obsolete */
+    XtActionList       /* actions */,
+    Cardinal           /* num_actions */
+);
+
+extern XtActionHookId XtAppAddActionHook(
+    XtAppContext       /* app_context */,
+    XtActionHookProc   /* proc */,
+    XtPointer          /* client_data */
+);
+
+extern void XtRemoveActionHook(
+    XtActionHookId     /* id */
+);
+
+extern void XtGetActionList(
+    WidgetClass                /* widget_class */,
+    XtActionList*      /* actions_return */,
+    Cardinal*          /* num_actions_return */
+);
+
+extern void XtCallActionProc(
+    Widget             /* widget */,
+    _Xconst _XtString  /* action */,
+    XEvent*            /* event */,
+    String*            /* params */,
+    Cardinal           /* num_params */
+);
+
+extern void XtRegisterGrabAction(
+    XtActionProc       /* action_proc */,
+    _XtBoolean                 /* owner_events */,
+    unsigned int       /* event_mask */,
+    int                        /* pointer_mode */,
+    int                        /* keyboard_mode */
+);
+
+extern void XtSetMultiClickTime(
+    Display*           /* dpy */,
+    int                /* milliseconds */
+);
+
+extern int XtGetMultiClickTime(
+    Display*           /* dpy */
+);
+
+extern KeySym XtGetActionKeysym(
+    XEvent*            /* event */,
+    Modifiers*         /* modifiers_return */
+);
+
+/***************************************************************
+ *
+ * Keycode and Keysym procedures for translation management
+ *
+ ****************************************************************/
+
+extern void XtTranslateKeycode(
+    Display*           /* dpy */,
+    _XtKeyCode                 /* keycode */,
+    Modifiers          /* modifiers */,
+    Modifiers*         /* modifiers_return */,
+    KeySym*            /* keysym_return */
+);
+
+extern void XtTranslateKey(
+    Display*           /* dpy */,
+    _XtKeyCode         /* keycode */,
+    Modifiers          /* modifiers */,
+    Modifiers*         /* modifiers_return */,
+    KeySym*            /* keysym_return */
+);
+
+extern void XtSetKeyTranslator(
+    Display*           /* dpy */,
+    XtKeyProc          /* proc */
+);
+
+extern void XtRegisterCaseConverter(
+    Display*           /* dpy */,
+    XtCaseProc                 /* proc */,
+    KeySym             /* start */,
+    KeySym             /* stop */
+);
+
+extern void XtConvertCase(
+    Display*           /* dpy */,
+    KeySym             /* keysym */,
+    KeySym*            /* lower_return */,
+    KeySym*            /* upper_return */
+);
+
+/****************************************************************
+ *
+ * Event Management
+ *
+ ****************************************************************/
+
+/* XtAllEvents is valid only for XtRemoveEventHandler and
+ * XtRemoveRawEventHandler; don't use it to select events!
+ */
+#define XtAllEvents ((EventMask) -1L)
+
+extern void XtAddEventHandler(
+    Widget             /* widget */,
+    EventMask          /* event_mask */,
+    _XtBoolean                 /* nonmaskable */,
+    XtEventHandler     /* proc */,
+    XtPointer          /* closure */
+);
+
+extern void XtRemoveEventHandler(
+    Widget             /* widget */,
+    EventMask          /* event_mask */,
+    _XtBoolean                 /* nonmaskable */,
+    XtEventHandler     /* proc */,
+    XtPointer          /* closure */
+);
+
+extern void XtAddRawEventHandler(
+    Widget             /* widget */,
+    EventMask          /* event_mask */,
+    _XtBoolean                 /* nonmaskable */,
+    XtEventHandler     /* proc */,
+    XtPointer          /* closure */
+);
+
+extern void XtRemoveRawEventHandler(
+    Widget             /* widget */,
+    EventMask          /* event_mask */,
+    _XtBoolean                 /* nonmaskable */,
+    XtEventHandler     /* proc */,
+    XtPointer          /* closure */
+);
+
+extern void XtInsertEventHandler(
+    Widget             /* widget */,
+    EventMask          /* event_mask */,
+    _XtBoolean                 /* nonmaskable */,
+    XtEventHandler     /* proc */,
+    XtPointer          /* closure */,
+    XtListPosition     /* position */
+);
+
+extern void XtInsertRawEventHandler(
+    Widget             /* widget */,
+    EventMask          /* event_mask */,
+    _XtBoolean                 /* nonmaskable */,
+    XtEventHandler     /* proc */,
+    XtPointer          /* closure */,
+    XtListPosition     /* position */
+);
+
+extern XtEventDispatchProc XtSetEventDispatcher(
+    Display*           /* dpy */,
+    int                        /* event_type */,
+    XtEventDispatchProc        /* proc */
+);
+
+extern Boolean XtDispatchEventToWidget(
+    Widget             /* widget */,
+    XEvent*            /* event */
+);
+
+extern void XtInsertEventTypeHandler(
+    Widget             /* widget */,
+    int                        /* type */,
+    XtPointer          /* select_data */,
+    XtEventHandler     /* proc */,
+    XtPointer          /* closure */,
+    XtListPosition     /* position */
+);
+
+extern void XtRemoveEventTypeHandler(
+    Widget             /* widget */,
+    int                        /* type */,
+    XtPointer          /* select_data */,
+    XtEventHandler     /* proc */,
+    XtPointer          /* closure */
+);
+
+extern EventMask XtBuildEventMask(
+    Widget             /* widget */
+);
+
+extern void XtRegisterExtensionSelector(
+    Display*           /* dpy */,
+    int                        /* min_event_type */,
+    int                        /* max_event_type */,
+    XtExtensionSelectProc /* proc */,
+    XtPointer          /* client_data */
+);
+
+extern void XtAddGrab(
+    Widget             /* widget */,
+    _XtBoolean                 /* exclusive */,
+    _XtBoolean                 /* spring_loaded */
+);
+
+extern void XtRemoveGrab(
+    Widget             /* widget */
+);
+
+extern void XtProcessEvent( /* obsolete */
+    XtInputMask                /* mask */
+);
+
+extern void XtAppProcessEvent(
+    XtAppContext               /* app_context */,
+    XtInputMask                /* mask */
+);
+
+extern void XtMainLoop( /* obsolete */
+    void
+);
+
+extern void XtAppMainLoop(
+    XtAppContext               /* app_context */
+);
+
+extern void XtAddExposureToRegion(
+    XEvent*            /* event */,
+    Region             /* region */
+);
+
+extern void XtSetKeyboardFocus(
+    Widget             /* subtree */,
+    Widget             /* descendent */
+);
+
+extern Widget XtGetKeyboardFocusWidget(
+    Widget             /* widget */
+);
+
+extern XEvent* XtLastEventProcessed(
+    Display*           /* dpy */
+);
+
+extern Time XtLastTimestampProcessed(
+    Display*           /* dpy */
+);
+
+/****************************************************************
+ *
+ * Event Gathering Routines
+ *
+ ****************************************************************/
+
+extern XtIntervalId XtAddTimeOut( /* obsolete */
+    unsigned long      /* interval */,
+    XtTimerCallbackProc /* proc */,
+    XtPointer          /* closure */
+);
+
+extern XtIntervalId XtAppAddTimeOut(
+    XtAppContext       /* app_context */,
+    unsigned long      /* interval */,
+    XtTimerCallbackProc /* proc */,
+    XtPointer          /* closure */
+);
+
+extern void XtRemoveTimeOut(
+    XtIntervalId       /* timer */
+);
+
+extern XtInputId XtAddInput( /* obsolete */
+    int                /* source */,
+    XtPointer          /* condition */,
+    XtInputCallbackProc /* proc */,
+    XtPointer          /* closure */
+);
+
+extern XtInputId XtAppAddInput(
+    XtAppContext               /* app_context */,
+    int                /* source */,
+    XtPointer          /* condition */,
+    XtInputCallbackProc /* proc */,
+    XtPointer          /* closure */
+);
+
+extern void XtRemoveInput(
+    XtInputId          /* id */
+);
+
+extern XtSignalId XtAddSignal(
+    XtSignalCallbackProc /* proc */,
+    XtPointer          /* closure */);
+
+extern XtSignalId XtAppAddSignal(
+    XtAppContext               /* app_context */,
+    XtSignalCallbackProc /* proc */,
+    XtPointer          /* closure */
+);
+
+extern void XtRemoveSignal(
+    XtSignalId                 /* id */
+);
+
+extern void XtNoticeSignal(
+    XtSignalId         /* id */
+);
+
+extern void XtNextEvent( /* obsolete */
+    XEvent*            /* event */
+);
+
+extern void XtAppNextEvent(
+    XtAppContext       /* app_context */,
+    XEvent*            /* event_return */
+);
+
+#define XtIMXEvent             1
+#define XtIMTimer              2
+#define XtIMAlternateInput     4
+#define XtIMSignal             8
+#define XtIMAll (XtIMXEvent | XtIMTimer | XtIMAlternateInput | XtIMSignal)
+
+extern Boolean XtPending( /* obsolete */
+    void
+);
+
+extern XtInputMask XtAppPending(
+    XtAppContext       /* app_context */
+);
+
+extern XtBlockHookId XtAppAddBlockHook(
+    XtAppContext       /* app_context */,
+    XtBlockHookProc    /* proc */,
+    XtPointer          /* client_data */
+);
+
+extern void XtRemoveBlockHook(
+    XtBlockHookId      /* id */
+);
+
+/****************************************************************
+ *
+ * Random utility routines
+ *
+ ****************************************************************/
+
+#define XtIsRectObj(object)    (_XtCheckSubclassFlag(object, (XtEnum)0x02))
+#define XtIsWidget(object)     (_XtCheckSubclassFlag(object, (XtEnum)0x04))
+#define XtIsComposite(widget)  (_XtCheckSubclassFlag(widget, (XtEnum)0x08))
+#define XtIsConstraint(widget) (_XtCheckSubclassFlag(widget, (XtEnum)0x10))
+#define XtIsShell(widget)      (_XtCheckSubclassFlag(widget, (XtEnum)0x20))
+
+#undef XtIsOverrideShell
+extern Boolean XtIsOverrideShell(Widget /* object */);
+#define XtIsOverrideShell(widget) \
+    (_XtIsSubclassOf(widget, (WidgetClass)overrideShellWidgetClass, \
+                    (WidgetClass)shellWidgetClass, (XtEnum)0x20))
+
+#define XtIsWMShell(widget)    (_XtCheckSubclassFlag(widget, (XtEnum)0x40))
+
+#undef XtIsVendorShell
+extern Boolean XtIsVendorShell(Widget /* object */);
+#define XtIsVendorShell(widget)        \
+    (_XtIsSubclassOf(widget, (WidgetClass)vendorShellWidgetClass, \
+                    (WidgetClass)wmShellWidgetClass, (XtEnum)0x40))
+
+#undef XtIsTransientShell
+extern Boolean XtIsTransientShell(Widget /* object */);
+#define XtIsTransientShell(widget) \
+    (_XtIsSubclassOf(widget, (WidgetClass)transientShellWidgetClass, \
+                    (WidgetClass)wmShellWidgetClass, (XtEnum)0x40))
+#define XtIsTopLevelShell(widget) (_XtCheckSubclassFlag(widget, (XtEnum)0x80))
+
+#undef XtIsApplicationShell
+extern Boolean XtIsApplicationShell(Widget /* object */);
+#define XtIsApplicationShell(widget) \
+    (_XtIsSubclassOf(widget, (WidgetClass)applicationShellWidgetClass, \
+                    (WidgetClass)topLevelShellWidgetClass, (XtEnum)0x80))
+
+#undef XtIsSessionShell
+extern Boolean XtIsSessionShell(Widget /* object */);
+#define XtIsSessionShell(widget) \
+    (_XtIsSubclassOf(widget, (WidgetClass)sessionShellWidgetClass, \
+                    (WidgetClass)topLevelShellWidgetClass, (XtEnum)0x80))
+
+extern void XtRealizeWidget(
+    Widget             /* widget */
+);
+
+void XtUnrealizeWidget(
+    Widget             /* widget */
+);
+
+extern void XtDestroyWidget(
+    Widget             /* widget */
+);
+
+extern void XtSetSensitive(
+    Widget             /* widget */,
+    _XtBoolean                 /* sensitive */
+);
+
+extern void XtSetMappedWhenManaged(
+    Widget             /* widget */,
+    _XtBoolean                 /* mapped_when_managed */
+);
+
+extern Widget XtNameToWidget(
+    Widget             /* reference */,
+    _Xconst _XtString  /* names */
+);
+
+extern Widget XtWindowToWidget(
+    Display*           /* display */,
+    Window             /* window */
+);
+
+extern XtPointer XtGetClassExtension(
+    WidgetClass                /* object_class */,
+    Cardinal           /* byte_offset */,
+    XrmQuark           /* type */,
+    long               /* version */,
+    Cardinal           /* record_size */
+);
+
+/***************************************************************
+ *
+ * Arg lists
+ *
+ ****************************************************************/
+
+
+#define XtSetArg(arg, n, d) \
+    ((void)( (arg).name = (n), (arg).value = (XtArgVal)(d) ))
+
+extern ArgList XtMergeArgLists(
+    ArgList            /* args1 */,
+    Cardinal           /* num_args1 */,
+    ArgList            /* args2 */,
+    Cardinal           /* num_args2 */
+);
+
+/***************************************************************
+ *
+ * Vararg lists
+ *
+ ****************************************************************/
+
+#define XtVaNestedList  "XtVaNestedList"
+#define XtVaTypedArg    "XtVaTypedArg"
+
+extern XtVarArgsList XtVaCreateArgsList(
+    XtPointer          /*unused*/, ...
+) _X_SENTINEL(0);
+
+/*************************************************************
+ *
+ * Information routines
+ *
+ ************************************************************/
+
+#ifndef _XtIntrinsicP_h
+
+/* We're not included from the private file, so define these */
+
+extern Display *XtDisplay(
+    Widget             /* widget */
+);
+
+extern Display *XtDisplayOfObject(
+    Widget             /* object */
+);
+
+extern Screen *XtScreen(
+    Widget             /* widget */
+);
+
+extern Screen *XtScreenOfObject(
+    Widget             /* object */
+);
+
+extern Window XtWindow(
+    Widget             /* widget */
+);
+
+extern Window XtWindowOfObject(
+    Widget             /* object */
+);
+
+extern String XtName(
+    Widget             /* object */
+);
+
+extern WidgetClass XtSuperclass(
+    Widget             /* object */
+);
+
+extern WidgetClass XtClass(
+    Widget             /* object */
+);
+
+extern Widget XtParent(
+    Widget             /* widget */
+);
+
+#endif /*_XtIntrinsicP_h*/
+
+#undef XtMapWidget
+extern void XtMapWidget(Widget /* w */);
+#define XtMapWidget(widget)    XMapWindow(XtDisplay(widget), XtWindow(widget))
+
+#undef XtUnmapWidget
+extern void XtUnmapWidget(Widget /* w */);
+#define XtUnmapWidget(widget)  \
+               XUnmapWindow(XtDisplay(widget), XtWindow(widget))
+
+extern void XtAddCallback(
+    Widget             /* widget */,
+    _Xconst _XtString  /* callback_name */,
+    XtCallbackProc     /* callback */,
+    XtPointer          /* closure */
+);
+
+extern void XtRemoveCallback(
+    Widget             /* widget */,
+    _Xconst _XtString  /* callback_name */,
+    XtCallbackProc     /* callback */,
+    XtPointer          /* closure */
+);
+
+extern void XtAddCallbacks(
+    Widget             /* widget */,
+    _Xconst _XtString  /* callback_name */,
+    XtCallbackList     /* callbacks */
+);
+
+extern void XtRemoveCallbacks(
+    Widget             /* widget */,
+    _Xconst _XtString  /* callback_name */,
+    XtCallbackList     /* callbacks */
+);
+
+extern void XtRemoveAllCallbacks(
+    Widget             /* widget */,
+    _Xconst _XtString  /* callback_name */
+);
+
+
+extern void XtCallCallbacks(
+    Widget             /* widget */,
+    _Xconst _XtString  /* callback_name */,
+    XtPointer          /* call_data */
+);
+
+extern void XtCallCallbackList(
+    Widget             /* widget */,
+    XtCallbackList     /* callbacks */,
+    XtPointer          /* call_data */
+);
+
+extern XtCallbackStatus XtHasCallbacks(
+    Widget             /* widget */,
+    _Xconst _XtString  /* callback_name */
+);
+
+/****************************************************************
+ *
+ * Geometry Management
+ *
+ ****************************************************************/
+
+
+extern XtGeometryResult XtMakeGeometryRequest(
+    Widget             /* widget */,
+    XtWidgetGeometry*  /* request */,
+    XtWidgetGeometry*  /* reply_return */
+);
+
+extern XtGeometryResult XtQueryGeometry(
+    Widget             /* widget */,
+    XtWidgetGeometry*  /* intended */,
+    XtWidgetGeometry*  /* preferred_return */
+);
+
+extern Widget XtCreatePopupShell(
+    _Xconst _XtString  /* name */,
+    WidgetClass        /* widgetClass */,
+    Widget             /* parent */,
+    ArgList            /* args */,
+    Cardinal           /* num_args */
+);
+
+extern Widget XtVaCreatePopupShell(
+    _Xconst _XtString  /* name */,
+    WidgetClass                /* widgetClass */,
+    Widget             /* parent */,
+    ...
+) _X_SENTINEL(0);
+
+extern void XtPopup(
+    Widget             /* popup_shell */,
+    XtGrabKind                 /* grab_kind */
+);
+
+extern void XtPopupSpringLoaded(
+    Widget             /* popup_shell */
+);
+
+extern void XtCallbackNone(
+    Widget             /* widget */,
+    XtPointer          /* closure */,
+    XtPointer          /* call_data */
+);
+
+extern void XtCallbackNonexclusive(
+    Widget             /* widget */,
+    XtPointer          /* closure */,
+    XtPointer          /* call_data */
+);
+
+extern void XtCallbackExclusive(
+    Widget             /* widget */,
+    XtPointer          /* closure */,
+    XtPointer          /* call_data */
+);
+
+extern void XtPopdown(
+    Widget             /* popup_shell */
+);
+
+extern void XtCallbackPopdown(
+    Widget             /* widget */,
+    XtPointer          /* closure */,
+    XtPointer          /* call_data */
+);
+
+extern void XtMenuPopupAction(
+    Widget             /* widget */,
+    XEvent*            /* event */,
+    String*            /* params */,
+    Cardinal*          /* num_params */
+);
+
+extern Widget XtCreateWidget(
+    _Xconst _XtString  /* name */,
+    WidgetClass        /* widget_class */,
+    Widget             /* parent */,
+    ArgList            /* args */,
+    Cardinal           /* num_args */
+);
+
+extern Widget XtCreateManagedWidget(
+    _Xconst _XtString  /* name */,
+    WidgetClass        /* widget_class */,
+    Widget             /* parent */,
+    ArgList            /* args */,
+    Cardinal           /* num_args */
+);
+
+extern Widget XtVaCreateWidget(
+    _Xconst _XtString  /* name */,
+    WidgetClass                /* widget */,
+    Widget             /* parent */,
+    ...
+) _X_SENTINEL(0);
+
+extern Widget XtVaCreateManagedWidget(
+    _Xconst _XtString  /* name */,
+    WidgetClass                /* widget_class */,
+    Widget             /* parent */,
+    ...
+) _X_SENTINEL(0);
+
+extern Widget XtCreateApplicationShell( /* obsolete */
+    _Xconst _XtString  /* name */,
+    WidgetClass        /* widget_class */,
+    ArgList            /* args */,
+    Cardinal           /* num_args */
+);
+
+extern Widget XtAppCreateShell(
+    _Xconst _XtString  /* application_name */,
+    _Xconst _XtString  /* application_class */,
+    WidgetClass        /* widget_class */,
+    Display*           /* display */,
+    ArgList            /* args */,
+    Cardinal           /* num_args */
+);
+
+extern Widget XtVaAppCreateShell(
+    _Xconst _XtString  /* application_name */,
+    _Xconst _XtString  /* application_class */,
+    WidgetClass                /* widget_class */,
+    Display*           /* display */,
+    ...
+) _X_SENTINEL(0);
+
+/****************************************************************
+ *
+ * Toolkit initialization
+ *
+ ****************************************************************/
+
+extern void XtToolkitInitialize(
+    void
+);
+
+extern XtLanguageProc XtSetLanguageProc(
+    XtAppContext       /* app_context */,
+    XtLanguageProc     /* proc */,
+    XtPointer          /* client_data */
+);
+
+extern void XtDisplayInitialize(
+    XtAppContext       /* app_context */,
+    Display*           /* dpy */,
+    _Xconst _XtString  /* application_name */,
+    _Xconst _XtString  /* application_class */,
+    XrmOptionDescRec*  /* options */,
+    Cardinal           /* num_options */,
+    int*               /* argc */,
+    char**             /* argv */
+);
+
+extern Widget XtOpenApplication(
+    XtAppContext*      /* app_context_return */,
+    _Xconst _XtString  /* application_class */,
+    XrmOptionDescList  /* options */,
+    Cardinal           /* num_options */,
+    int*               /* argc_in_out */,
+    String*            /* argv_in_out */,
+    String*            /* fallback_resources */,
+    WidgetClass                /* widget_class */,
+    ArgList            /* args */,
+    Cardinal           /* num_args */
+);
+
+extern Widget XtVaOpenApplication(
+    XtAppContext*      /* app_context_return */,
+    _Xconst _XtString  /* application_class */,
+    XrmOptionDescList  /* options */,
+    Cardinal           /* num_options */,
+    int*               /* argc_in_out */,
+    String*            /* argv_in_out */,
+    String*            /* fallback_resources */,
+    WidgetClass                /* widget_class */,
+    ...
+) _X_SENTINEL(0);
+
+extern Widget XtAppInitialize( /* obsolete */
+    XtAppContext*      /* app_context_return */,
+    _Xconst _XtString  /* application_class */,
+    XrmOptionDescList  /* options */,
+    Cardinal           /* num_options */,
+    int*               /* argc_in_out */,
+    String*            /* argv_in_out */,
+    String*            /* fallback_resources */,
+    ArgList            /* args */,
+    Cardinal           /* num_args */
+);
+
+extern Widget XtVaAppInitialize( /* obsolete */
+    XtAppContext*      /* app_context_return */,
+    _Xconst _XtString  /* application_class */,
+    XrmOptionDescList  /* options */,
+    Cardinal           /* num_options */,
+    int*               /* argc_in_out */,
+    String*            /* argv_in_out */,
+    String*            /* fallback_resources */,
+    ...
+) _X_SENTINEL(0);
+
+extern Widget XtInitialize( /* obsolete */
+    _Xconst _XtString  /* shell_name */,
+    _Xconst _XtString  /* application_class */,
+    XrmOptionDescRec*  /* options */,
+    Cardinal           /* num_options */,
+    int*               /* argc */,
+    char**             /* argv */
+);
+
+extern Display *XtOpenDisplay(
+    XtAppContext       /* app_context */,
+    _Xconst _XtString  /* display_string */,
+    _Xconst _XtString  /* application_name */,
+    _Xconst _XtString  /* application_class */,
+    XrmOptionDescRec*  /* options */,
+    Cardinal           /* num_options */,
+    int*               /* argc */,
+    char**             /* argv */
+);
+
+extern XtAppContext XtCreateApplicationContext(
+    void
+);
+
+extern void XtAppSetFallbackResources(
+    XtAppContext       /* app_context */,
+    String*            /* specification_list */
+);
+
+extern void XtDestroyApplicationContext(
+    XtAppContext       /* app_context */
+);
+
+extern void XtInitializeWidgetClass(
+    WidgetClass        /* widget_class */
+);
+
+extern XtAppContext XtWidgetToApplicationContext(
+    Widget             /* widget */
+);
+
+extern XtAppContext XtDisplayToApplicationContext(
+    Display*           /* dpy */
+);
+
+extern XrmDatabase XtDatabase(
+    Display*           /* dpy */
+);
+
+extern XrmDatabase XtScreenDatabase(
+    Screen*            /* screen */
+);
+
+extern void XtCloseDisplay(
+    Display*           /* dpy */
+);
+
+extern void XtGetApplicationResources(
+    Widget             /* widget */,
+    XtPointer          /* base */,
+    XtResourceList     /* resources */,
+    Cardinal           /* num_resources */,
+    ArgList            /* args */,
+    Cardinal           /* num_args */
+);
+
+extern void XtVaGetApplicationResources(
+    Widget             /* widget */,
+    XtPointer          /* base */,
+    XtResourceList     /* resources */,
+    Cardinal           /* num_resources */,
+    ...
+) _X_SENTINEL(0);
+
+extern void XtGetSubresources(
+    Widget             /* widget */,
+    XtPointer          /* base */,
+    _Xconst _XtString  /* name */,
+    _Xconst _XtString  /* class */,
+    XtResourceList     /* resources */,
+    Cardinal           /* num_resources */,
+    ArgList            /* args */,
+    Cardinal           /* num_args */
+);
+
+extern void XtVaGetSubresources(
+    Widget             /* widget */,
+    XtPointer          /* base */,
+    _Xconst _XtString  /* name */,
+    _Xconst _XtString  /* class */,
+    XtResourceList     /* resources */,
+    Cardinal           /* num_resources */,
+    ...
+) _X_SENTINEL(0);
+
+extern void XtSetValues(
+    Widget             /* widget */,
+    ArgList            /* args */,
+    Cardinal           /* num_args */
+);
+
+extern void XtVaSetValues(
+    Widget             /* widget */,
+    ...
+) _X_SENTINEL(0);
+
+extern void XtGetValues(
+    Widget             /* widget */,
+    ArgList            /* args */,
+    Cardinal           /* num_args */
+);
+
+extern void XtVaGetValues(
+    Widget             /* widget */,
+    ...
+) _X_SENTINEL(0);
+
+extern void XtSetSubvalues(
+    XtPointer          /* base */,
+    XtResourceList     /* resources */,
+    Cardinal           /* num_resources */,
+    ArgList            /* args */,
+    Cardinal           /* num_args */
+);
+
+extern void XtVaSetSubvalues(
+    XtPointer          /* base */,
+    XtResourceList     /* resources */,
+    Cardinal           /* num_resources */,
+    ...
+) _X_SENTINEL(0);
+
+extern void XtGetSubvalues(
+    XtPointer          /* base */,
+    XtResourceList     /* resources */,
+    Cardinal           /* num_resources */,
+    ArgList            /* args */,
+    Cardinal           /* num_args */
+);
+
+extern void XtVaGetSubvalues(
+    XtPointer          /* base */,
+    XtResourceList     /* resources */,
+    Cardinal           /* num_resources */,
+    ...
+) _X_SENTINEL(0);
+
+extern void XtGetResourceList(
+    WidgetClass        /* widget_class */,
+    XtResourceList*    /* resources_return */,
+    Cardinal*          /* num_resources_return */
+);
+
+extern void XtGetConstraintResourceList(
+    WidgetClass        /* widget_class */,
+    XtResourceList*    /* resources_return */,
+    Cardinal*          /* num_resources_return */
+);
+
+#define XtUnspecifiedPixmap    ((Pixmap)2)
+#define XtUnspecifiedShellInt  (-1)
+#define XtUnspecifiedWindow    ((Window)2)
+#define XtUnspecifiedWindowGroup ((Window)3)
+#define XtCurrentDirectory     "XtCurrentDirectory"
+#define XtDefaultForeground    "XtDefaultForeground"
+#define XtDefaultBackground    "XtDefaultBackground"
+#define XtDefaultFont          "XtDefaultFont"
+#define XtDefaultFontSet       "XtDefaultFontSet"
+
+#if defined(CRAY)
+#define XtOffset(p_type,field) _Offsetof(p_type,field)
+#else  /* ! CRAY */
+#define XtOffset(p_type,field) \
+       ((Cardinal) (((char *) (&(((p_type)NULL)->field))) - ((char *) NULL)))
+#endif /* !CRAY */
+
+#ifdef offsetof
+#define XtOffsetOf(s_type,field) offsetof(s_type,field)
+#else
+#define XtOffsetOf(s_type,field) XtOffset(s_type*,field)
+#endif
+
+/*************************************************************
+ *
+ * Session Management
+ *
+ ************************************************************/
+
+typedef struct _XtCheckpointTokenRec {
+    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 */
+    int                type;           /* implementation private */
+    Widget     widget;         /* implementation private */
+} XtCheckpointTokenRec, *XtCheckpointToken;
+
+XtCheckpointToken XtSessionGetToken(
+    Widget             /* widget */
+);
+
+void XtSessionReturnToken(
+    XtCheckpointToken  /* token */
+);
+
+/*************************************************************
+ *
+ * Error Handling
+ *
+ ************************************************************/
+
+extern XtErrorMsgHandler XtAppSetErrorMsgHandler(
+    XtAppContext       /* app_context */,
+    XtErrorMsgHandler  /* handler */
+);
+
+extern void XtSetErrorMsgHandler( /* obsolete */
+    XtErrorMsgHandler  /* handler */
+);
+
+extern XtErrorMsgHandler XtAppSetWarningMsgHandler(
+    XtAppContext       /* app_context */,
+    XtErrorMsgHandler  /* handler */
+);
+
+extern void XtSetWarningMsgHandler( /* obsolete */
+    XtErrorMsgHandler  /* handler */
+);
+
+extern void XtAppErrorMsg(
+    XtAppContext       /* app_context */,
+    _Xconst _XtString  /* name */,
+    _Xconst _XtString  /* type */,
+    _Xconst _XtString  /* class */,
+    _Xconst _XtString  /* default */,
+    String*            /* params */,
+    Cardinal*          /* num_params */
+);
+
+extern void XtErrorMsg( /* obsolete */
+    _Xconst _XtString  /* name */,
+    _Xconst _XtString  /* type */,
+    _Xconst _XtString  /* class */,
+    _Xconst _XtString  /* default */,
+    String*            /* params */,
+    Cardinal*          /* num_params */
+);
+
+extern void XtAppWarningMsg(
+    XtAppContext       /* app_context */,
+    _Xconst _XtString  /* name */,
+    _Xconst _XtString  /* type */,
+    _Xconst _XtString  /* class */,
+    _Xconst _XtString  /* default */,
+    String*            /* params */,
+    Cardinal*          /* num_params */
+);
+
+extern void XtWarningMsg( /* obsolete */
+    _Xconst _XtString  /* name */,
+    _Xconst _XtString  /* type */,
+    _Xconst _XtString  /* class */,
+    _Xconst _XtString  /* default */,
+    String*            /* params */,
+    Cardinal*          /* num_params */
+);
+
+extern XtErrorHandler XtAppSetErrorHandler(
+    XtAppContext       /* app_context */,
+    XtErrorHandler     /* handler */
+);
+
+extern void XtSetErrorHandler( /* obsolete */
+    XtErrorHandler     /* handler */
+);
+
+extern XtErrorHandler XtAppSetWarningHandler(
+    XtAppContext       /* app_context */,
+    XtErrorHandler     /* handler */
+);
+
+extern void XtSetWarningHandler( /* obsolete */
+    XtErrorHandler     /* handler */
+);
+
+extern void XtAppError(
+    XtAppContext       /* app_context */,
+    _Xconst _XtString  /* message */
+);
+
+extern void XtError( /* obsolete */
+    _Xconst _XtString  /* message */
+);
+
+extern void XtAppWarning(
+    XtAppContext       /* app_context */,
+    _Xconst _XtString  /* message */
+);
+
+extern void XtWarning( /* obsolete */
+    _Xconst _XtString  /* message */
+);
+
+extern XrmDatabase *XtAppGetErrorDatabase(
+    XtAppContext       /* app_context */
+);
+
+extern XrmDatabase *XtGetErrorDatabase( /* obsolete */
+    void
+);
+
+extern void XtAppGetErrorDatabaseText(
+    XtAppContext       /* app_context */,
+    _Xconst _XtString  /* name */,
+    _Xconst _XtString  /* type */,
+    _Xconst _XtString  /* class */,
+    _Xconst _XtString  /* default */,
+    String             /* buffer_return */,
+    int                /* nbytes */,
+    XrmDatabase        /* database */
+);
+
+extern void XtGetErrorDatabaseText( /* obsolete */
+    _Xconst _XtString  /* name */,
+    _Xconst _XtString  /* type */,
+    _Xconst _XtString  /* class */,
+    _Xconst _XtString  /* default */,
+    String             /* buffer_return */,
+    int                /* nbytes */
+);
+
+/****************************************************************
+ *
+ * Memory Management
+ *
+ ****************************************************************/
+
+extern char *XtMalloc(
+    Cardinal           /* size */
+);
+
+extern char *XtCalloc(
+    Cardinal           /* num */,
+    Cardinal           /* size */
+);
+
+extern char *XtRealloc(
+    char*              /* ptr */,
+    Cardinal           /* num */
+);
+
+extern void XtFree(
+    char*              /* ptr */
+);
+
+#ifndef _X_RESTRICT_KYWD
+# define _X_RESTRICT_KYWD
+#endif
+extern Cardinal XtAsprintf(
+    String *new_string,
+    _Xconst char * _X_RESTRICT_KYWD format,
+    ...
+) _X_ATTRIBUTE_PRINTF(2,3);
+
+#ifdef XTTRACEMEMORY
+
+extern char *_XtMalloc( /* implementation-private */
+    Cardinal   /* size */,
+    char *     /* file */,
+    int                /* line */
+);
+
+extern char *_XtRealloc( /* implementation-private */
+    char *     /* ptr */,
+    Cardinal    /* size */,
+    char *     /* file */,
+    int                /* line */
+);
+
+extern char *_XtCalloc( /* implementation-private */
+    Cardinal   /* num */,
+    Cardinal   /* size */,
+    char *     /* file */,
+    int                /* line */
+);
+
+extern void _XtFree( /* implementation-private */
+    char *     /* ptr */
+);
+
+#define XtMalloc(size) _XtMalloc(size, __FILE__, __LINE__)
+#define XtRealloc(ptr,size) _XtRealloc(ptr, size, __FILE__, __LINE__)
+#define XtCalloc(num,size) _XtCalloc(num, size, __FILE__, __LINE__)
+#define XtFree(ptr) _XtFree(ptr)
+
+#endif /* ifdef XTTRACEMEMORY */
+
+#define XtNew(type) ((type *) XtMalloc((unsigned) sizeof(type)))
+
+#undef XtNewString
+extern String XtNewString(String /* str */);
+#define XtNewString(str) \
+    ((str) != NULL ? (strcpy(XtMalloc((unsigned)strlen(str) + 1), str)) : NULL)
+
+/*************************************************************
+ *
+ *  Work procs
+ *
+ **************************************************************/
+
+extern XtWorkProcId XtAddWorkProc( /* obsolete */
+    XtWorkProc                 /* proc */,
+    XtPointer          /* closure */
+);
+
+extern XtWorkProcId XtAppAddWorkProc(
+    XtAppContext       /* app_context */,
+    XtWorkProc                 /* proc */,
+    XtPointer          /* closure */
+);
+
+extern void  XtRemoveWorkProc(
+    XtWorkProcId       /* id */
+);
+
+
+/****************************************************************
+ *
+ * Graphic Context Management
+ *****************************************************************/
+
+extern GC XtGetGC(
+    Widget             /* widget */,
+    XtGCMask           /* valueMask */,
+    XGCValues*                 /* values */
+);
+
+extern GC XtAllocateGC(
+    Widget             /* widget */,
+    Cardinal           /* depth */,
+    XtGCMask           /* valueMask */,
+    XGCValues*                 /* values */,
+    XtGCMask           /* dynamicMask */,
+    XtGCMask           /* unusedMask */
+);
+
+/* This implementation of XtDestroyGC differs from the formal specification
+ * for historic backwards compatibility reasons.  As other implementations
+ * may conform to the spec, use of XtReleaseGC is strongly encouraged.
+ */
+extern void XtDestroyGC( /* obsolete */
+    GC                         /* gc */
+);
+
+extern void XtReleaseGC(
+    Widget             /* object */,
+    GC                         /* gc */
+);
+
+
+
+extern void XtAppReleaseCacheRefs(
+    XtAppContext       /* app_context */,
+    XtCacheRef*                /* cache_ref */
+);
+
+extern void XtCallbackReleaseCacheRef(
+    Widget             /* widget */,
+    XtPointer          /* closure */,  /* XtCacheRef */
+    XtPointer          /* call_data */
+);
+
+extern void XtCallbackReleaseCacheRefList(
+    Widget             /* widget */,
+    XtPointer          /* closure */,  /* XtCacheRef* */
+    XtPointer          /* call_data */
+);
+
+extern void XtSetWMColormapWindows(
+    Widget             /* widget */,
+    Widget*            /* list */,
+    Cardinal           /* count */
+);
+
+extern String XtFindFile(
+    _Xconst _XtString  /* path */,
+    Substitution       /* substitutions */,
+    Cardinal           /* num_substitutions */,
+    XtFilePredicate    /* predicate */
+);
+
+extern String XtResolvePathname(
+    Display*           /* dpy */,
+    _Xconst _XtString  /* type */,
+    _Xconst _XtString  /* filename */,
+    _Xconst _XtString  /* suffix */,
+    _Xconst _XtString  /* path */,
+    Substitution       /* substitutions */,
+    Cardinal           /* num_substitutions */,
+    XtFilePredicate    /* predicate */
+);
+
+/****************************************************************
+ *
+ * Selections
+ *
+ *****************************************************************/
+
+#define XT_CONVERT_FAIL (Atom)0x80000001
+
+extern void XtDisownSelection(
+    Widget             /* widget */,
+    Atom               /* selection */,
+    Time               /* time */
+);
+
+extern void XtGetSelectionValue(
+    Widget             /* widget */,
+    Atom               /* selection */,
+    Atom               /* target */,
+    XtSelectionCallbackProc /* callback */,
+    XtPointer          /* closure */,
+    Time               /* time */
+);
+
+extern void XtGetSelectionValues(
+    Widget             /* widget */,
+    Atom               /* selection */,
+    Atom*              /* targets */,
+    int                /* count */,
+    XtSelectionCallbackProc /* callback */,
+    XtPointer*         /* closures */,
+    Time               /* time */
+);
+
+extern void XtAppSetSelectionTimeout(
+    XtAppContext       /* app_context */,
+    unsigned long      /* timeout */
+);
+
+extern void XtSetSelectionTimeout( /* obsolete */
+    unsigned long      /* timeout */
+);
+
+extern unsigned long XtAppGetSelectionTimeout(
+    XtAppContext       /* app_context */
+);
+
+extern unsigned long XtGetSelectionTimeout( /* obsolete */
+    void
+);
+
+extern XSelectionRequestEvent *XtGetSelectionRequest(
+    Widget             /* widget */,
+    Atom               /* selection */,
+    XtRequestId        /* request_id */
+);
+
+extern void XtGetSelectionValueIncremental(
+    Widget             /* widget */,
+    Atom               /* selection */,
+    Atom               /* target */,
+    XtSelectionCallbackProc /* selection_callback */,
+    XtPointer          /* client_data */,
+    Time               /* time */
+);
+
+extern void XtGetSelectionValuesIncremental(
+    Widget             /* widget */,
+    Atom               /* selection */,
+    Atom*              /* targets */,
+    int                /* count */,
+    XtSelectionCallbackProc /* callback */,
+    XtPointer*         /* client_data */,
+    Time               /* time */
+);
+
+extern void XtSetSelectionParameters(
+    Widget             /* requestor */,
+    Atom               /* selection */,
+    Atom               /* type */,
+    XtPointer          /* value */,
+    unsigned long      /* length */,
+    int                        /* format */
+);
+
+extern void XtGetSelectionParameters(
+    Widget             /* owner */,
+    Atom               /* selection */,
+    XtRequestId                /* request_id */,
+    Atom*              /* type_return */,
+    XtPointer*         /* value_return */,
+    unsigned long*     /* length_return */,
+    int*               /* format_return */
+);
+
+extern void XtCreateSelectionRequest(
+    Widget             /* requestor */,
+    Atom               /* selection */
+);
+
+extern void XtSendSelectionRequest(
+    Widget             /* requestor */,
+    Atom               /* selection */,
+    Time               /* time */
+);
+
+extern void XtCancelSelectionRequest(
+    Widget             /* requestor */,
+    Atom               /* selection */
+);
+
+extern Atom XtReservePropertyAtom(
+    Widget             /* widget */
+);
+
+extern void XtReleasePropertyAtom(
+    Widget             /* widget */,
+    Atom               /* selection */
+);
+
+extern void XtGrabKey(
+    Widget             /* widget */,
+    _XtKeyCode                 /* keycode */,
+    Modifiers          /* modifiers */,
+    _XtBoolean                 /* owner_events */,
+    int                /* pointer_mode */,
+    int                /* keyboard_mode */
+);
+
+extern void XtUngrabKey(
+    Widget             /* widget */,
+    _XtKeyCode                 /* keycode */,
+    Modifiers          /* modifiers */
+);
+
+extern int XtGrabKeyboard(
+    Widget             /* widget */,
+    _XtBoolean                 /* owner_events */,
+    int                /* pointer_mode */,
+    int                /* keyboard_mode */,
+    Time               /* time */
+);
+
+extern void XtUngrabKeyboard(
+    Widget             /* widget */,
+    Time               /* time */
+);
+
+extern void XtGrabButton(
+    Widget             /* widget */,
+    int                /* button */,
+    Modifiers          /* modifiers */,
+    _XtBoolean                 /* owner_events */,
+    unsigned int       /* event_mask */,
+    int                /* pointer_mode */,
+    int                /* keyboard_mode */,
+    Window             /* confine_to */,
+    Cursor             /* cursor */
+);
+
+extern void XtUngrabButton(
+    Widget             /* widget */,
+    unsigned int       /* button */,
+    Modifiers          /* modifiers */
+);
+
+extern int XtGrabPointer(
+    Widget             /* widget */,
+    _XtBoolean                 /* owner_events */,
+    unsigned int       /* event_mask */,
+    int                /* pointer_mode */,
+    int                /* keyboard_mode */,
+    Window             /* confine_to */,
+    Cursor             /* cursor */,
+    Time               /* time */
+);
+
+extern void XtUngrabPointer(
+    Widget             /* widget */,
+    Time               /* time */
+);
+
+extern void XtGetApplicationNameAndClass(
+    Display*           /* dpy */,
+    String*            /* name_return */,
+    String*            /* class_return */
+);
+
+extern void XtRegisterDrawable(
+    Display*           /* dpy */,
+    Drawable           /* drawable */,
+    Widget             /* widget */
+);
+
+extern void XtUnregisterDrawable(
+    Display*           /* dpy */,
+    Drawable           /* drawable */
+);
+
+extern Widget XtHooksOfDisplay(
+    Display*           /* dpy */
+);
+
+typedef struct {
+    String type;
+    Widget widget;
+    ArgList args;
+    Cardinal num_args;
+} XtCreateHookDataRec, *XtCreateHookData;
+
+typedef struct {
+    String type;
+    Widget widget;
+    XtPointer event_data;
+    Cardinal num_event_data;
+} XtChangeHookDataRec, *XtChangeHookData;
+
+typedef struct {
+    Widget old, req;
+    ArgList args;
+    Cardinal num_args;
+} XtChangeHookSetValuesDataRec, *XtChangeHookSetValuesData;
+
+typedef struct {
+    String type;
+    Widget widget;
+    XtGeometryMask changeMask;
+    XWindowChanges changes;
+} XtConfigureHookDataRec, *XtConfigureHookData;
+
+typedef struct {
+    String type;
+    Widget widget;
+    XtWidgetGeometry* request;
+    XtWidgetGeometry* reply;
+    XtGeometryResult result;
+} XtGeometryHookDataRec, *XtGeometryHookData;
+
+typedef struct {
+    String type;
+    Widget widget;
+} XtDestroyHookDataRec, *XtDestroyHookData;
+
+extern void XtGetDisplays(
+    XtAppContext       /* app_context */,
+    Display***         /* dpy_return */,
+    Cardinal*          /* num_dpy_return */
+);
+
+extern Boolean XtToolkitThreadInitialize(
+    void
+);
+
+extern void XtAppSetExitFlag(
+    XtAppContext       /* app_context */
+);
+
+extern Boolean XtAppGetExitFlag(
+    XtAppContext       /* app_context */
+);
+
+extern void XtAppLock(
+    XtAppContext       /* app_context */
+);
+
+extern void XtAppUnlock(
+    XtAppContext       /* app_context */
+);
+
+/*
+ *     Predefined Resource Converters
+ */
+
+
+/* String converters */
+
+extern Boolean XtCvtStringToAcceleratorTable(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* none */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+extern Boolean XtCvtStringToAtom(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* Display */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+extern Boolean XtCvtStringToBool(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* none */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+extern Boolean XtCvtStringToBoolean(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* none */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+extern Boolean XtCvtStringToCommandArgArray(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* none */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+extern Boolean XtCvtStringToCursor(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* Display */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+extern Boolean XtCvtStringToDimension(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* none */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+extern Boolean XtCvtStringToDirectoryString(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* none */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+extern Boolean XtCvtStringToDisplay(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* none */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+extern Boolean XtCvtStringToFile(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* none */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+extern Boolean XtCvtStringToFloat(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* none */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+extern Boolean XtCvtStringToFont(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* Display */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+extern Boolean XtCvtStringToFontSet(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* Display, locale */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+extern Boolean XtCvtStringToFontStruct(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* Display */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+extern Boolean XtCvtStringToGravity(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+extern Boolean XtCvtStringToInitialState(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* none */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+extern Boolean XtCvtStringToInt(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* none */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+extern Boolean XtCvtStringToPixel(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* Screen, Colormap */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+#define XtCvtStringToPosition XtCvtStringToShort
+
+extern Boolean XtCvtStringToRestartStyle(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* none */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+extern Boolean XtCvtStringToShort(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* none */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+extern Boolean XtCvtStringToTranslationTable(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* none */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+extern Boolean XtCvtStringToUnsignedChar(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* none */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+extern Boolean XtCvtStringToVisual(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* Screen, depth */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+/* int converters */
+
+extern Boolean XtCvtIntToBool(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* none */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+extern Boolean XtCvtIntToBoolean(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* none */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+extern Boolean XtCvtIntToColor(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* Screen, Colormap */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+#define XtCvtIntToDimension XtCvtIntToShort
+
+extern Boolean XtCvtIntToFloat(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* none */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+extern Boolean XtCvtIntToFont(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* none */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+extern Boolean XtCvtIntToPixel(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* none */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+extern Boolean XtCvtIntToPixmap(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* none */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+#define XtCvtIntToPosition XtCvtIntToShort
+
+extern Boolean XtCvtIntToShort(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* none */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+extern Boolean XtCvtIntToUnsignedChar(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* none */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+/* Color converter */
+
+extern Boolean XtCvtColorToPixel(
+    Display*   /* dpy */,
+    XrmValuePtr /* args */,    /* none */
+    Cardinal*   /* num_args */,
+    XrmValuePtr        /* fromVal */,
+    XrmValuePtr        /* toVal */,
+    XtPointer* /* closure_ret */
+);
+
+/* Pixel converter */
+
+#define XtCvtPixelToColor XtCvtIntToColor
+
+
+_XFUNCPROTOEND
+
+#endif /*_XtIntrinsic_h*/
+/* DON'T ADD STUFF AFTER THIS #endif */
diff --git a/include/X11/IntrinsicI.h b/include/X11/IntrinsicI.h
new file mode 100644 (file)
index 0000000..845ab48
--- /dev/null
@@ -0,0 +1,229 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifndef _XtintrinsicI_h
+#define _XtintrinsicI_h
+
+#include "Xtos.h"
+#include "IntrinsicP.h"
+#ifdef WIN32
+#define _WILLWINSOCK_
+#endif
+#include <X11/Xos.h>
+
+#include "Object.h"
+#include "RectObj.h"
+#include "ObjectP.h"
+#include "RectObjP.h"
+
+#include "ConvertI.h"
+#include "TranslateI.h"
+
+#define RectObjClassFlag       0x02
+#define WidgetClassFlag                0x04
+#define CompositeClassFlag     0x08
+#define ConstraintClassFlag    0x10
+#define ShellClassFlag         0x20
+#define WMShellClassFlag       0x40
+#define TopLevelClassFlag      0x80
+
+/*
+ * The following macros, though very handy, are not suitable for
+ * IntrinsicP.h as they violate the rule that arguments are to
+ * be evaluated exactly once.
+ */
+
+#define XtDisplayOfObject(object) \
+    (XtIsWidget(object) ? (object)->core.screen->display : \
+    _XtIsHookObject(object) ? ((HookObject)(object))->hooks.screen->display : \
+    _XtWindowedAncestor(object)->core.screen->display)
+
+#define XtScreenOfObject(object) \
+    (XtIsWidget(object) ? (object)->core.screen : \
+    _XtIsHookObject(object) ? ((HookObject)(object))->hooks.screen : \
+    _XtWindowedAncestor(object)->core.screen)
+
+#define XtWindowOfObject(object) \
+    ((XtIsWidget(object) ? (object) : _XtWindowedAncestor(object)) \
+     ->core.window)
+
+#define XtIsManaged(object) \
+    (XtIsRectObj(object) ? (object)->core.managed : False)
+
+#define XtIsSensitive(object) \
+    (XtIsRectObj(object) ? ((object)->core.sensitive && \
+                           (object)->core.ancestor_sensitive) : False)
+
+
+/****************************************************************
+ *
+ * Byte utilities
+ *
+ ****************************************************************/
+
+#define _XBCOPYFUNC _XtBcopy
+#include <X11/Xfuncs.h>
+
+#define XtMemmove(dst, src, size)      \
+    if ((char *)(dst) != (char *)(src)) {                  \
+       (void) memcpy((char *) (dst), (char *) (src), (int) (size)); \
+    }
+
+#define XtBZero(dst, size)     \
+       bzero((char *) (dst), (int) (size))
+
+#define XtMemcmp(b1, b2, size)                 \
+       memcmp((char *) (b1), (char *) (b2), (int) (size))
+
+
+/****************************************************************
+ *
+ * Stack cache allocation/free
+ *
+ ****************************************************************/
+
+#define XtStackAlloc(size, stack_cache_array)     \
+    ((size) <= sizeof(stack_cache_array)         \
+    ?  (XtPointer)(stack_cache_array)            \
+    :  XtMalloc((unsigned)(size)))
+
+#define XtStackFree(pointer, stack_cache_array) \
+    { if ((pointer) != ((XtPointer)(stack_cache_array))) XtFree(pointer); }
+
+/***************************************************************
+ *
+ * Filename defines
+ *
+ **************************************************************/
+
+/* used by XtResolvePathname */
+#ifndef XFILESEARCHPATHDEFAULT
+#define XFILESEARCHPATHDEFAULT "/usr/lib/X11/%L/%T/%N%S:/usr/lib/X11/%l/%T/%N%S:/usr/lib/X11/%T/%N%S"
+#endif
+
+/* the following two were both "X Toolkit " prior to R4 */
+#ifndef XTERROR_PREFIX
+#define XTERROR_PREFIX ""
+#endif
+
+#ifndef XTWARNING_PREFIX
+#define XTWARNING_PREFIX ""
+#endif
+
+#ifndef ERRORDB
+#define ERRORDB "/usr/lib/X11/XtErrorDB"
+#endif
+
+_XFUNCPROTOBEGIN
+
+extern String XtCXtToolkitError;
+
+extern void _XtAllocError(
+    String     /* alloc_type */
+);
+
+extern void _XtCompileResourceList(
+    XtResourceList     /* resources */,
+    Cardinal           /* num_resources */
+);
+
+extern XtGeometryResult _XtMakeGeometryRequest(
+    Widget             /* widget */,
+    XtWidgetGeometry*  /* request */,
+    XtWidgetGeometry*  /* reply_return */,
+    Boolean*           /* clear_rect_obj */
+);
+
+extern Boolean _XtIsHookObject(
+    Widget      /* widget */
+);
+
+extern void _XtAddShellToHookObj(
+    Widget      /* widget */
+);
+
+/* GCManager.c */
+extern void _XtGClistFree(Display *dpy, XtPerDisplay pd);
+
+/** GeoTattler stuff */
+
+#ifdef XT_GEO_TATTLER
+
+extern void _XtGeoTab (int);
+extern void _XtGeoTrace (
+                           Widget widget,
+                           ...
+) _X_ATTRIBUTE_PRINTF(2,3);
+
+#define CALLGEOTAT(f) f
+
+#else /* XT_GEO_TATTLER */
+
+#define CALLGEOTAT(f)
+
+#endif /* XT_GEO_TATTLER */
+
+#ifndef XTTRACEMEMORY
+
+extern char* __XtMalloc (
+    unsigned   /* size */
+);
+extern char* __XtCalloc (
+    unsigned   /* num */,
+    unsigned   /* size */
+);
+
+#else
+
+#define __XtMalloc XtMalloc
+#define __XtCalloc XtCalloc
+#endif
+
+_XFUNCPROTOEND
+
+#endif /* _XtintrinsicI_h */
+/* DON'T ADD STUFF AFTER THIS #endif */
diff --git a/include/X11/IntrinsicP.h b/include/X11/IntrinsicP.h
new file mode 100644 (file)
index 0000000..bb6570b
--- /dev/null
@@ -0,0 +1,324 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifndef _XtintrinsicP_h
+#define _XtintrinsicP_h
+
+#include <X11/Intrinsic.h>
+
+/*
+ * Field sizes and offsets of XrmResource must match those of XtResource.
+ * Type long is used instead of XrmQuark here because XrmQuark and String
+ * are not the same size on all systems.
+ */
+typedef struct {
+    long       xrm_name;         /* Resource name quark                */
+    long       xrm_class;        /* Resource class quark               */
+    long       xrm_type;         /* Resource representation type quark */
+    Cardinal   xrm_size;         /* Size in bytes of representation    */
+    int                xrm_offset;       /* -offset-1                          */
+    long       xrm_default_type; /* Default representation type quark  */
+    XtPointer  xrm_default_addr; /* Default resource address           */
+} XrmResource, *XrmResourceList;
+
+typedef unsigned long XtVersionType;
+
+#define XT_VERSION 11
+#ifndef XT_REVISION
+#define XT_REVISION 6
+#endif
+#define XtVersion (XT_VERSION * 1000 + XT_REVISION)
+#define XtVersionDontCheck 0
+
+typedef void (*XtProc)(
+    void
+);
+
+typedef void (*XtWidgetClassProc)(
+    WidgetClass /* class */
+);
+
+typedef void (*XtWidgetProc)(
+    Widget     /* widget */
+);
+
+typedef Boolean (*XtAcceptFocusProc)(
+    Widget     /* widget */,
+    Time*      /* time */
+);
+
+typedef void (*XtArgsProc)(
+    Widget     /* widget */,
+    ArgList    /* args */,
+    Cardinal*  /* num_args */
+);
+
+typedef void (*XtInitProc)(
+    Widget     /* request */,
+    Widget     /* new */,
+    ArgList    /* args */,
+    Cardinal*  /* num_args */
+);
+
+typedef Boolean (*XtSetValuesFunc)(
+    Widget     /* old */,
+    Widget     /* request */,
+    Widget     /* new */,
+    ArgList    /* args */,
+    Cardinal*  /* num_args */
+);
+
+typedef Boolean (*XtArgsFunc)(
+    Widget     /* widget */,
+    ArgList    /* args */,
+    Cardinal*  /* num_args */
+);
+
+typedef void (*XtAlmostProc)(
+    Widget             /* old */,
+    Widget             /* new */,
+    XtWidgetGeometry*  /* request */,
+    XtWidgetGeometry*  /* reply */
+);
+
+typedef void (*XtExposeProc)(
+    Widget     /* widget */,
+    XEvent*    /* event */,
+    Region     /* region */
+);
+
+/* compress_exposure options*/
+#define XtExposeNoCompress             ((XtEnum)False)
+#define XtExposeCompressSeries         ((XtEnum)True)
+#define XtExposeCompressMultiple       2
+#define XtExposeCompressMaximal                3
+
+/* modifiers */
+#define XtExposeGraphicsExpose         0x10
+#define XtExposeGraphicsExposeMerged   0x20
+#define XtExposeNoExpose               0x40
+#define XtExposeNoRegion               0x80
+
+typedef void (*XtRealizeProc)(
+    Widget               /* widget */,
+    XtValueMask*         /* mask */,
+    XSetWindowAttributes* /* attributes */
+);
+
+typedef XtGeometryResult (*XtGeometryHandler)(
+    Widget             /* widget */,
+    XtWidgetGeometry*  /* request */,
+    XtWidgetGeometry*  /* reply */
+);
+
+typedef void (*XtStringProc)(
+    Widget     /* widget */,
+    String     /* str */
+);
+
+typedef struct {
+    String     name;   /* resource name */
+    String     type;   /* representation type name */
+    XtArgVal   value;  /* representation */
+    int                size;   /* size of representation */
+} XtTypedArg, *XtTypedArgList;
+
+typedef void (*XtAllocateProc)(
+    WidgetClass                /* widget_class */,
+    Cardinal *         /* constraint_size */,
+    Cardinal *         /* more_bytes */,
+    ArgList            /* args */,
+    Cardinal *         /* num_args */,
+    XtTypedArgList     /* typed_args */,
+    Cardinal *         /* num_typed_args */,
+    Widget *           /* widget_return */,
+    XtPointer *                /* more_bytes_return */
+);
+
+typedef void (*XtDeallocateProc)(
+    Widget             /* widget */,
+    XtPointer          /* more_bytes */
+);
+
+struct _XtStateRec;    /* Forward declare before use for C++ */
+
+typedef struct _XtTMRec {
+    XtTranslations  translations;      /* private to Translation Manager    */
+    XtBoundActions  proc_table;                /* procedure bindings for actions    */
+    struct _XtStateRec *current_state;  /* Translation Manager state ptr     */
+    unsigned long   lastEventTime;
+} XtTMRec, *XtTM;
+
+#include <X11/CoreP.h>
+#include <X11/CompositeP.h>
+#include <X11/ConstrainP.h>
+#include <X11/ObjectP.h>
+#include <X11/RectObjP.h>
+
+#define XtDisplay(widget)      DisplayOfScreen((widget)->core.screen)
+#define XtScreen(widget)       ((widget)->core.screen)
+#define XtWindow(widget)       ((widget)->core.window)
+
+#define XtClass(widget)                ((widget)->core.widget_class)
+#define XtSuperclass(widget)   (XtClass(widget)->core_class.superclass)
+#define XtIsRealized(object)   (XtWindowOfObject(object) != None)
+#define XtParent(widget)       ((widget)->core.parent)
+
+#undef XtIsRectObj
+extern Boolean XtIsRectObj(Widget);
+#define XtIsRectObj(obj) \
+    (((Object)(obj))->object.widget_class->core_class.class_inited & 0x02)
+
+#undef XtIsWidget
+extern Boolean XtIsWidget(Widget);
+#define XtIsWidget(obj) \
+    (((Object)(obj))->object.widget_class->core_class.class_inited & 0x04)
+
+#undef XtIsComposite
+extern Boolean XtIsComposite(Widget);
+#define XtIsComposite(obj) \
+    (((Object)(obj))->object.widget_class->core_class.class_inited & 0x08)
+
+#undef XtIsConstraint
+extern Boolean XtIsConstraint(Widget);
+#define XtIsConstraint(obj) \
+    (((Object)(obj))->object.widget_class->core_class.class_inited & 0x10)
+
+#undef XtIsShell
+extern Boolean XtIsShell(Widget);
+#define XtIsShell(obj) \
+    (((Object)(obj))->object.widget_class->core_class.class_inited & 0x20)
+
+#undef XtIsWMShell
+extern Boolean XtIsWMShell(Widget);
+#define XtIsWMShell(obj) \
+    (((Object)(obj))->object.widget_class->core_class.class_inited & 0x40)
+
+#undef XtIsTopLevelShell
+extern Boolean XtIsTopLevelShell(Widget);
+#define XtIsTopLevelShell(obj) \
+    (((Object)(obj))->object.widget_class->core_class.class_inited & 0x80)
+
+#ifdef DEBUG
+#define XtCheckSubclass(w, widget_class_ptr, message)  \
+       if (!XtIsSubclass(((Widget)(w)), (widget_class_ptr))) { \
+           String params[3];                           \
+           Cardinal num_params = 3;                    \
+           params[0] = ((Widget)(w))->core.widget_class->core_class.class_name;\
+           params[1] = (widget_class_ptr)->core_class.class_name;           \
+           params[2] = (message);                                           \
+           XtAppErrorMsg(XtWidgetToApplicationContext((Widget)(w)),         \
+                   "subclassMismatch", "xtCheckSubclass", "XtToolkitError", \
+                   "Widget class %s found when subclass of %s expected: %s",\
+                   params, &num_params);               \
+       }
+#else
+#define XtCheckSubclass(w, widget_class, message)      /* nothing */
+#endif
+
+_XFUNCPROTOBEGIN
+
+extern Widget _XtWindowedAncestor( /* internal; implementation-dependent */
+    Widget             /* object */
+);
+
+extern void _XtInherit(
+    void
+);
+
+extern void _XtHandleFocus(
+    Widget             /* widget */,
+    XtPointer          /* client_data */,
+    XEvent *           /* event */,
+    Boolean *          /* cont */);
+
+extern void XtCreateWindow(
+    Widget             /* widget */,
+    unsigned int       /* window_class */,
+    Visual*            /* visual */,
+    XtValueMask                /* value_mask */,
+    XSetWindowAttributes* /* attributes */
+);
+
+extern void XtResizeWidget(
+    Widget             /* widget */,
+    _XtDimension       /* width */,
+    _XtDimension       /* height */,
+    _XtDimension       /* border_width */
+);
+
+extern void XtMoveWidget(
+    Widget             /* widget */,
+    _XtPosition                /* x */,
+    _XtPosition                /* y */
+);
+
+extern void XtConfigureWidget(
+    Widget             /* widget */,
+    _XtPosition                /* x */,
+    _XtPosition                /* y */,
+    _XtDimension       /* width */,
+    _XtDimension       /* height */,
+    _XtDimension       /* border_width */
+);
+
+extern void XtResizeWindow(
+    Widget             /* widget */
+);
+
+extern void XtProcessLock(
+    void
+);
+
+extern void XtProcessUnlock(
+    void
+);
+
+_XFUNCPROTOEND
+
+#endif /* _XtIntrinsicP_h */
+/* DON'T ADD STUFF AFTER THIS #endif */
diff --git a/include/X11/Object.h b/include/X11/Object.h
new file mode 100644 (file)
index 0000000..4be1f39
--- /dev/null
@@ -0,0 +1,63 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifndef _XtObject_h
+#define _XtObject_h
+
+_XFUNCPROTOBEGIN
+
+typedef struct _ObjectRec *Object;
+typedef struct _ObjectClassRec *ObjectClass;
+
+#ifndef VMS
+externalref WidgetClass objectClass;
+#endif
+
+_XFUNCPROTOEND
+
+#endif /* _XtObject_h */
+/* DON'T ADD STUFF AFTER THIS #endif */
diff --git a/include/X11/ObjectP.h b/include/X11/ObjectP.h
new file mode 100644 (file)
index 0000000..6e296f7
--- /dev/null
@@ -0,0 +1,141 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifndef _Xt_ObjectP_h_
+#define _Xt_ObjectP_h_
+
+#include <X11/Object.h>
+
+_XFUNCPROTOBEGIN
+
+/**********************************************************
+ * Object Instance Data Structures
+ *
+ **********************************************************/
+/* these fields match CorePart and can not be changed */
+
+typedef struct _ObjectPart {
+    Widget          self;               /* pointer to widget itself          */
+    WidgetClass     widget_class;       /* pointer to Widget's ClassRec      */
+    Widget          parent;             /* parent widget                     */
+    XrmName         xrm_name;           /* widget resource name quarkified   */
+    Boolean         being_destroyed;    /* marked for destroy                */
+    XtCallbackList  destroy_callbacks;  /* who to call when widget destroyed */
+    XtPointer       constraints;        /* constraint record                 */
+} ObjectPart;
+
+typedef struct _ObjectRec {
+    ObjectPart  object;
+} ObjectRec;
+
+/********************************************************
+ * Object Class Data Structures
+ *
+ ********************************************************/
+/* these fields match CoreClassPart and can not be changed */
+/* ideally these structures would only contain the fields required;
+   but because the CoreClassPart cannot be changed at this late date
+   extraneous fields are necessary to make the field offsets match */
+
+typedef struct _ObjectClassPart {
+
+    WidgetClass     superclass;         /* pointer to superclass ClassRec   */
+    String          class_name;         /* widget resource class name       */
+    Cardinal        widget_size;        /* size in bytes of widget record   */
+    XtProc          class_initialize;   /* class initialization proc        */
+    XtWidgetClassProc class_part_initialize; /* dynamic initialization      */
+    XtEnum          class_inited;       /* has class been initialized?      */
+    XtInitProc      initialize;         /* initialize subclass fields       */
+    XtArgsProc      initialize_hook;    /* notify that initialize called    */
+    XtProc          obj1;              /* NULL                             */
+    XtPointer       obj2;               /* NULL                             */
+    Cardinal        obj3;               /* NULL                             */
+    XtResourceList  resources;          /* resources for subclass fields    */
+    Cardinal        num_resources;      /* number of entries in resources   */
+    XrmClass        xrm_class;          /* resource class quarkified        */
+    Boolean         obj4;               /* NULL                             */
+    XtEnum          obj5;               /* NULL                             */
+    Boolean         obj6;               /* NULL                                    */
+    Boolean         obj7;               /* NULL                             */
+    XtWidgetProc    destroy;            /* free data for subclass pointers  */
+    XtProc          obj8;               /* NULL                             */
+    XtProc          obj9;               /* NULL                                    */
+    XtSetValuesFunc set_values;         /* set subclass resource values     */
+    XtArgsFunc      set_values_hook;    /* notify that set_values called    */
+    XtProc          obj10;              /* NULL                             */
+    XtArgsProc      get_values_hook;    /* notify that get_values called    */
+    XtProc          obj11;              /* NULL                             */
+    XtVersionType   version;            /* version of intrinsics used       */
+    XtPointer       callback_private;   /* list of callback offsets         */
+    String          obj12;              /* NULL                             */
+    XtProc          obj13;              /* NULL                             */
+    XtProc          obj14;              /* NULL                             */
+    XtPointer       extension;          /* pointer to extension record      */
+}ObjectClassPart;
+
+typedef struct {
+    XtPointer next_extension;  /* 1st 4 required for all extension records */
+    XrmQuark record_type;      /* NULLQUARK; when on ObjectClassPart */
+    long version;              /* must be XtObjectExtensionVersion */
+    Cardinal record_size;      /* sizeof(ObjectClassExtensionRec) */
+    XtAllocateProc allocate;
+    XtDeallocateProc deallocate;
+} ObjectClassExtensionRec, *ObjectClassExtension;
+
+typedef struct _ObjectClassRec {
+    ObjectClassPart object_class;
+} ObjectClassRec;
+
+externalref ObjectClassRec objectClassRec;
+
+_XFUNCPROTOEND
+
+#define XtObjectExtensionVersion 1L
+#define XtInheritAllocate ((XtAllocateProc) _XtInherit)
+#define XtInheritDeallocate ((XtDeallocateProc) _XtInherit)
+
+#endif /*_Xt_ObjectP_h_*/
diff --git a/include/X11/PassivGraI.h b/include/X11/PassivGraI.h
new file mode 100644 (file)
index 0000000..6b8cb52
--- /dev/null
@@ -0,0 +1,185 @@
+/********************************************************
+
+Copyright 1988 by Hewlett-Packard Company
+Copyright 1987, 1988, 1989 by Digital Equipment Corporation, Maynard
+
+Permission to use, copy, modify, and distribute this software
+and its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that copyright notice and this permission
+notice appear in supporting documentation, and that the names of
+Hewlett-Packard or Digital not be used in advertising or
+publicity pertaining to distribution of the software without specific,
+written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+********************************************************/
+
+/*
+
+Copyright 1987, 1988, 1989, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifndef _PDI_h_
+#define _PDI_h_
+
+
+#define KEYBOARD TRUE
+#define POINTER  FALSE
+
+_XFUNCPROTOBEGIN
+
+typedef enum {
+    XtNoServerGrab,
+    XtPassiveServerGrab,
+    XtActiveServerGrab,
+    XtPseudoPassiveServerGrab,
+    XtPseudoActiveServerGrab
+}XtServerGrabType;
+
+typedef struct _XtServerGrabRec {
+    struct _XtServerGrabRec    *next;
+    Widget                     widget;
+    unsigned int               ownerEvents:1;
+    unsigned int               pointerMode:1;
+    unsigned int               keyboardMode:1;
+    unsigned int               hasExt:1;
+    unsigned int               confineToIsWidgetWin:1;
+    KeyCode                    keybut;
+    unsigned short             modifiers;
+    unsigned short             eventMask;
+} XtServerGrabRec, *XtServerGrabPtr;
+
+typedef struct _XtGrabExtRec {
+    Mask                       *pKeyButMask;
+    Mask                       *pModifiersMask;
+    Window                     confineTo;
+    Cursor                     cursor;
+} XtServerGrabExtRec, *XtServerGrabExtPtr;
+
+#define GRABEXT(p) ((XtServerGrabExtPtr)((p)+1))
+
+typedef struct _XtDeviceRec{
+    XtServerGrabRec    grab;   /* need copy in order to protect
+                                  during grab */
+    XtServerGrabType   grabType;
+}XtDeviceRec, *XtDevice;
+
+#define XtMyAncestor   0
+#define XtMyDescendant 1
+#define XtMyCousin     2
+#define XtMySelf       3
+#define XtUnrelated    4
+typedef char XtGeneology; /* do not use an enum makes PerWidgetInput larger */
+
+typedef struct {
+    Widget             focusKid;
+    XtServerGrabPtr    keyList, ptrList;
+    Widget             queryEventDescendant;
+    unsigned int       map_handler_added:1;
+    unsigned int       realize_handler_added:1;
+    unsigned int       active_handler_added:1;
+    unsigned int       haveFocus:1;
+    XtGeneology                focalPoint;
+}XtPerWidgetInputRec, *XtPerWidgetInput;
+
+typedef struct XtPerDisplayInputRec{
+    XtGrabList         grabList;
+    XtDeviceRec keyboard, pointer;
+    KeyCode    activatingKey;
+    Widget     *trace;
+    int                traceDepth, traceMax;
+    Widget     focusWidget;
+}XtPerDisplayInputRec, *XtPerDisplayInput;
+
+#define IsServerGrab(g) ((g == XtPassiveServerGrab) ||\
+                        (g == XtActiveServerGrab))
+
+#define IsAnyGrab(g) ((g == XtPassiveServerGrab) ||\
+                     (g == XtActiveServerGrab)  ||\
+                     (g == XtPseudoPassiveServerGrab))
+
+#define IsEitherPassiveGrab(g) ((g == XtPassiveServerGrab) ||\
+                               (g == XtPseudoPassiveServerGrab))
+
+#define IsPseudoGrab(g) ((g == XtPseudoPassiveServerGrab))
+
+extern void _XtDestroyServerGrabs(
+    Widget             /* w */,
+    XtPointer          /* pwi */, /*XtPerWidgetInput*/
+    XtPointer          /* call_data */
+);
+
+extern XtPerWidgetInput _XtGetPerWidgetInput(
+    Widget     /* widget */,
+    _XtBoolean /* create */
+);
+
+extern XtServerGrabPtr _XtCheckServerGrabsOnWidget(
+    XEvent*            /* event */,
+    Widget             /* widget */,
+    _XtBoolean         /* isKeyboard */
+);
+
+/*
+extern XtGrabList* _XtGetGrabList( XtPerDisplayInput );
+*/
+
+#define _XtGetGrabList(pdi) (&(pdi)->grabList)
+
+extern void _XtFreePerWidgetInput(
+    Widget             /* w */,
+    XtPerWidgetInput   /* pwi */
+);
+
+extern Widget _XtProcessKeyboardEvent(
+    XKeyEvent*         /* event */,
+    Widget             /* widget */,
+    XtPerDisplayInput  /* pdi */
+);
+
+extern Widget _XtProcessPointerEvent(
+    XButtonEvent*      /* event */,
+    Widget             /* widget */,
+    XtPerDisplayInput  /* pdi */
+);
+
+extern void _XtRegisterPassiveGrabs(
+    Widget             /* widget */
+);
+
+extern void _XtClearAncestorCache(
+    Widget             /* widget */
+);
+
+_XFUNCPROTOEND
+
+#endif /* _PDI_h_ */
diff --git a/include/X11/RectObj.h b/include/X11/RectObj.h
new file mode 100644 (file)
index 0000000..fba883a
--- /dev/null
@@ -0,0 +1,63 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifndef _XtRect_h
+#define _XtRect_h
+
+_XFUNCPROTOBEGIN
+
+typedef struct _RectObjRec *RectObj;
+typedef struct _RectObjClassRec *RectObjClass;
+
+#ifndef VMS
+externalref WidgetClass rectObjClass;
+#endif
+
+_XFUNCPROTOEND
+
+#endif /* _XtRect_h */
+/* DON'T ADD STUFF AFTER THIS #endif */
diff --git a/include/X11/RectObjP.h b/include/X11/RectObjP.h
new file mode 100644 (file)
index 0000000..bb5a7d3
--- /dev/null
@@ -0,0 +1,131 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifndef _Xt_RectObjP_h_
+#define _Xt_RectObjP_h_
+
+#include <X11/RectObj.h>
+#include <X11/ObjectP.h>
+
+_XFUNCPROTOBEGIN
+
+/**********************************************************
+ * Rectangle Object Instance Data Structures
+ *
+ **********************************************************/
+/* these fields match CorePart and can not be changed */
+
+typedef struct _RectObjPart {
+    Position        x, y;               /* rectangle position               */
+    Dimension       width, height;      /* rectangle dimensions             */
+    Dimension       border_width;       /* rectangle border width           */
+    Boolean         managed;            /* is widget geometry managed?       */
+    Boolean         sensitive;          /* is widget sensitive to user events*/
+    Boolean         ancestor_sensitive; /* are all ancestors sensitive?      */
+}RectObjPart;
+
+typedef struct _RectObjRec {
+    ObjectPart object;
+    RectObjPart rectangle;
+} RectObjRec;
+
+
+
+/********************************************************
+ * Rectangle Object Class Data Structures
+ *
+ ********************************************************/
+/* these fields match CoreClassPart and can not be changed */
+/* ideally these structures would only contain the fields required;
+   but because the CoreClassPart cannot be changed at this late date
+   extraneous fields are necessary to make the field offsets match */
+
+typedef struct _RectObjClassPart {
+
+    WidgetClass     superclass;         /* pointer to superclass ClassRec   */
+    String          class_name;         /* widget resource class name       */
+    Cardinal        widget_size;        /* size in bytes of widget record   */
+    XtProc          class_initialize;   /* class initialization proc        */
+    XtWidgetClassProc class_part_initialize; /* dynamic initialization      */
+    XtEnum          class_inited;       /* has class been initialized?      */
+    XtInitProc      initialize;         /* initialize subclass fields       */
+    XtArgsProc      initialize_hook;    /* notify that initialize called    */
+    XtProc          rect1;             /* NULL                             */
+    XtPointer       rect2;              /* NULL                             */
+    Cardinal        rect3;              /* NULL                             */
+    XtResourceList  resources;          /* resources for subclass fields    */
+    Cardinal        num_resources;      /* number of entries in resources   */
+    XrmClass        xrm_class;          /* resource class quarkified        */
+    Boolean         rect4;              /* NULL                             */
+    XtEnum          rect5;              /* NULL                             */
+    Boolean         rect6;              /* NULL                                    */
+    Boolean         rect7;              /* NULL                             */
+    XtWidgetProc    destroy;            /* free data for subclass pointers  */
+    XtWidgetProc    resize;             /* geom manager changed widget size */
+    XtExposeProc    expose;             /* rediplay rectangle               */
+    XtSetValuesFunc set_values;         /* set subclass resource values     */
+    XtArgsFunc      set_values_hook;    /* notify that set_values called    */
+    XtAlmostProc    set_values_almost;  /* set values almost for geometry   */
+    XtArgsProc      get_values_hook;    /* notify that get_values called    */
+    XtProc          rect9;              /* NULL                             */
+    XtVersionType   version;            /* version of intrinsics used       */
+    XtPointer       callback_private;   /* list of callback offsets         */
+    String          rect10;             /* NULL                             */
+    XtGeometryHandler query_geometry;   /* return preferred geometry        */
+    XtProc          rect11;             /* NULL                             */
+    XtPointer       extension;          /* pointer to extension record      */
+} RectObjClassPart;
+
+typedef struct _RectObjClassRec {
+    RectObjClassPart rect_class;
+} RectObjClassRec;
+
+externalref RectObjClassRec rectObjClassRec;
+
+_XFUNCPROTOEND
+
+#endif /*_Xt_RectObjP_h_*/
diff --git a/include/X11/ResConfigP.h b/include/X11/ResConfigP.h
new file mode 100644 (file)
index 0000000..1e1d85a
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+/*****************************************************************
+
+(C) COPYRIGHT International Business Machines Corp. 1992,1997
+    All Rights Reserved
+
+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.
+
+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 IBM CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
+BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL 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 IBM Corporation 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 IBM
+Corporation.
+
+******************************************************************/
+
+#ifndef _RESCONFIGP_H
+#define _RESCONFIGP_H
+
+#include <X11/Xfuncproto.h>
+
+_XFUNCPROTOBEGIN
+
+/*
+ * Atom names for resource configuration management customization tool.
+ */
+#define RCM_DATA "Custom Data"
+#define RCM_INIT "Custom Init"
+
+extern void _XtResourceConfigurationEH(
+       Widget          /* w */,
+       XtPointer       /* client_data */,
+       XEvent *        /* event */
+);
+
+_XFUNCPROTOEND
+
+#endif
diff --git a/include/X11/ResourceI.h b/include/X11/ResourceI.h
new file mode 100644 (file)
index 0000000..4533f06
--- /dev/null
@@ -0,0 +1,100 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/****************************************************************
+ *
+ * Resources
+ *
+ ****************************************************************/
+
+#ifndef _XtresourceI_h
+#define _XtresourceI_h
+
+#define StringToQuark(string) XrmStringToQuark(string)
+#define StringToName(string) XrmStringToName(string)
+#define StringToClass(string) XrmStringToClass(string)
+
+_XFUNCPROTOBEGIN
+
+extern void _XtDependencies(
+    XtResourceList  * /* class_resp */,
+    Cardinal       * /* class_num_resp */,
+    XrmResourceList * /* super_res */,
+    Cardinal        /* super_num_res */,
+    Cardinal        /* super_widget_size */);
+
+extern void _XtResourceDependencies(
+    WidgetClass  /* wc */
+);
+
+extern void _XtConstraintResDependencies(
+    ConstraintWidgetClass  /* wc */
+);
+
+extern XtCacheRef* _XtGetResources(
+    Widget         /* w */,
+    ArgList        /* args */,
+    Cardinal       /* num_args */,
+    XtTypedArgList  /* typed_args */,
+    Cardinal*      /* num_typed_args */
+);
+
+extern void _XtCopyFromParent(
+    Widget             /* widget */,
+    int                        /* offset */,
+    XrmValue*          /* value */
+);
+
+extern void _XtCopyToArg(char *src, XtArgVal *dst, unsigned int size);
+extern void _XtCopyFromArg(XtArgVal src, char *dst, unsigned int size);
+extern XrmResourceList* _XtCreateIndirectionTable(XtResourceList resources,
+                                                 Cardinal num_resources);
+extern void _XtResourceListInitialize(void);
+
+_XFUNCPROTOEND
+
+#endif /* _XtresourceI_h */
diff --git a/include/X11/SelectionI.h b/include/X11/SelectionI.h
new file mode 100644 (file)
index 0000000..7f39b87
--- /dev/null
@@ -0,0 +1,168 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifndef _XtselectionI_h
+#define _XtselectionI_h
+
+#include "Intrinsic.h"
+
+typedef struct _RequestRec *Request;
+typedef struct _SelectRec *Select;
+
+typedef struct _RequestRec {
+   Select ctx;               /* logical owner */
+   Widget widget;            /* widget actually receiving Selection events */
+   Window requestor;
+   Atom property;
+   Atom target;
+   Atom type;
+   int format;
+   XtPointer value;
+   unsigned long bytelength;
+   unsigned long offset;
+   XtIntervalId timeout;
+   XSelectionRequestEvent event; /* for XtGetSelectionRequest */
+   Boolean allSent;
+} RequestRec;
+
+typedef struct {
+  Atom prop;
+  Boolean avail;
+} SelectionPropRec, *SelectionProp;
+
+typedef struct {
+  Display *dpy;
+  Atom incr_atom, indirect_atom, timestamp_atom;
+  int propCount;
+  SelectionProp list;
+} PropListRec, *PropList;
+
+typedef struct _SelectRec {
+    Atom selection;                    /* constant */
+    Display *dpy;                      /* constant */
+    Widget widget;
+    Time time;
+    unsigned long serial;
+    XtConvertSelectionProc convert;
+    XtLoseSelectionProc loses;
+    XtSelectionDoneProc notify;
+    XtCancelConvertSelectionProc owner_cancel;
+    XtPointer owner_closure;
+    PropList prop_list;
+    Request req;                       /* state for local non-incr xfer */
+    int ref_count;                     /* of active transfers */
+    unsigned int incremental:1;
+    unsigned int free_when_done:1;
+    unsigned int was_disowned:1;
+} SelectRec;
+
+typedef struct _ParamRec {
+    Atom selection;
+    Atom param;
+} ParamRec, *Param;
+
+typedef struct _ParamInfoRec {
+    unsigned int count;
+    Param paramlist;
+} ParamInfoRec, *ParamInfo;
+
+typedef struct _QueuedRequestRec {
+    Atom selection;
+    Atom target;
+    Atom param;
+    XtSelectionCallbackProc callback;
+    XtPointer closure;
+    Time time;
+    Boolean incremental;
+} QueuedRequestRec, *QueuedRequest;
+
+typedef struct _QueuedRequestInfoRec {
+    int count;
+    Atom *selections;
+    QueuedRequest *requests;
+} QueuedRequestInfoRec, *QueuedRequestInfo;
+
+typedef struct {
+    XtSelectionCallbackProc *callbacks;
+    XtPointer *req_closure;
+    Atom property;
+    Atom *target;
+    Atom type;
+    int format;
+    char *value;
+    int bytelength;
+    int offset;
+    XtIntervalId timeout;
+    XtEventHandler proc;
+    Widget widget;
+    Time time;
+    Select ctx;
+    Boolean *incremental;
+    int current;
+} CallBackInfoRec, *CallBackInfo;
+
+typedef struct {
+  Atom target;
+  Atom property;
+} IndirectPair;
+
+#define IndirectPairWordSize 2
+
+typedef struct {
+  int active_transfer_count;
+} RequestWindowRec;
+
+#define MAX_SELECTION_INCR(dpy) (((65536 < XMaxRequestSize(dpy)) ? \
+       (65536 << 2)  : (XMaxRequestSize(dpy) << 2))-100)
+
+#define MATCH_SELECT(event, info) ((event->time == info->time) && \
+           (event->requestor == XtWindow(info->widget)) && \
+           (event->selection == info->ctx->selection) && \
+           (event->target == *info->target))
+
+#endif /* _XtselectionI_h */
+/* DON'T ADD STUFF AFTER THIS #endif */
diff --git a/include/X11/ShellI.h b/include/X11/ShellI.h
new file mode 100644 (file)
index 0000000..c1ee0b1
--- /dev/null
@@ -0,0 +1,10 @@
+#ifndef _XtShellInternal_h
+#define _XtShellInternal_h
+
+#include <X11/Xfuncproto.h>
+
+_XFUNCPROTOBEGIN
+
+extern void _XtShellGetCoordinates(Widget widget, Position *x, Position *y);
+
+#endif /* _XtShellInternal_h */
diff --git a/include/X11/ShellP.h b/include/X11/ShellP.h
new file mode 100644 (file)
index 0000000..51ac3a0
--- /dev/null
@@ -0,0 +1,434 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+ * ShellP.h - Private definitions for Shell widget
+ *
+ * Author:     Paul Asente
+ *             Digital Equipment Corporation
+ *             Western Software Laboratory
+ * Date:       Thu Dec 3, 1987
+ */
+
+#ifndef _XtShellPrivate_h
+#define _XtShellPrivate_h
+
+#include <X11/Shell.h>
+
+/* *****
+ * ***** VendorP.h is included later on; it needs fields defined in the first
+ * ***** part of this header file
+ * *****
+ */
+
+_XFUNCPROTOBEGIN
+
+/***********************************************************************
+ *
+ * Shell Widget Private Data
+ *
+ ***********************************************************************/
+
+/* New fields for the Shell widget class record */
+
+typedef struct {
+    XtPointer       extension;          /* pointer to extension record      */
+} ShellClassPart;
+
+typedef struct {
+    XtPointer next_extension;  /* 1st 4 mandated for all extension records */
+    XrmQuark record_type;      /* NULLQUARK; on ShellClassPart */
+    long version;              /* must be XtShellExtensionVersion */
+    Cardinal record_size;      /* sizeof(ShellClassExtensionRec) */
+    XtGeometryHandler root_geometry_manager;
+} ShellClassExtensionRec, *ShellClassExtension;
+
+#define XtShellExtensionVersion 1L
+#define XtInheritRootGeometryManager ((XtGeometryHandler)_XtInherit)
+
+typedef struct _ShellClassRec {
+       CoreClassPart      core_class;
+       CompositeClassPart composite_class;
+       ShellClassPart  shell_class;
+} ShellClassRec;
+
+externalref ShellClassRec shellClassRec;
+
+/* New fields for the shell widget */
+
+typedef struct {
+       char       *geometry;
+       XtCreatePopupChildProc  create_popup_child_proc;
+       XtGrabKind      grab_kind;
+       Boolean     spring_loaded;
+       Boolean     popped_up;
+       Boolean     allow_shell_resize;
+       Boolean     client_specified; /* re-using old name */
+#define _XtShellPositionValid  ((Boolean)(1<<0))
+#define _XtShellNotReparented  ((Boolean)(1<<1))
+#define _XtShellPPositionOK    ((Boolean)(1<<2))
+#define _XtShellGeometryParsed ((Boolean)(1<<3))
+       Boolean     save_under;
+       Boolean     override_redirect;
+
+       XtCallbackList popup_callback;
+       XtCallbackList popdown_callback;
+       Visual*     visual;
+} ShellPart;
+
+typedef  struct {
+       CorePart        core;
+       CompositePart   composite;
+       ShellPart       shell;
+} ShellRec, *ShellWidget;
+
+/***********************************************************************
+ *
+ * OverrideShell Widget Private Data
+ *
+ ***********************************************************************/
+
+/* New fields for the OverrideShell widget class record */
+
+typedef struct {
+    XtPointer       extension;          /* pointer to extension record      */
+} OverrideShellClassPart;
+
+typedef struct _OverrideShellClassRec {
+       CoreClassPart      core_class;
+       CompositeClassPart composite_class;
+       ShellClassPart  shell_class;
+       OverrideShellClassPart  override_shell_class;
+} OverrideShellClassRec;
+
+externalref OverrideShellClassRec overrideShellClassRec;
+
+/* No new fields for the override shell widget */
+
+typedef struct {int frabjous;} OverrideShellPart;
+
+typedef  struct {
+       CorePart        core;
+       CompositePart   composite;
+       ShellPart       shell;
+       OverrideShellPart override;
+} OverrideShellRec, *OverrideShellWidget;
+
+/***********************************************************************
+ *
+ * WMShell Widget Private Data
+ *
+ ***********************************************************************/
+
+/* New fields for the WMShell widget class record */
+
+typedef struct {
+    XtPointer       extension;          /* pointer to extension record      */
+} WMShellClassPart;
+
+typedef struct _WMShellClassRec {
+       CoreClassPart      core_class;
+       CompositeClassPart composite_class;
+       ShellClassPart  shell_class;
+       WMShellClassPart wm_shell_class;
+} WMShellClassRec;
+
+externalref WMShellClassRec wmShellClassRec;
+
+/* New fields for the WM shell widget */
+
+typedef struct {
+       char       *title;
+       int         wm_timeout;
+       Boolean     wait_for_wm;
+       Boolean     transient;
+       Boolean     urgency;
+       Widget      client_leader;
+       String      window_role;
+       struct _OldXSizeHints { /* pre-R4 Xlib structure */
+           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;
+       int win_gravity;
+       Atom title_encoding;
+} WMShellPart;
+
+typedef  struct {
+       CorePart        core;
+       CompositePart   composite;
+       ShellPart       shell;
+       WMShellPart     wm;
+} WMShellRec, *WMShellWidget;
+
+_XFUNCPROTOEND
+
+#include <X11/VendorP.h>
+
+_XFUNCPROTOBEGIN
+
+/***********************************************************************
+ *
+ * TransientShell Widget Private Data
+ *
+ ***********************************************************************/
+
+/* New fields for the TransientShell widget class record */
+
+typedef struct {
+    XtPointer       extension;          /* pointer to extension record      */
+} TransientShellClassPart;
+
+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;
+
+externalref TransientShellClassRec transientShellClassRec;
+
+/* New fields for the transient shell widget */
+
+typedef struct {
+       Widget transient_for;
+} TransientShellPart;
+
+typedef  struct {
+       CorePart        core;
+       CompositePart   composite;
+       ShellPart       shell;
+       WMShellPart     wm;
+       VendorShellPart vendor;
+       TransientShellPart transient;
+} TransientShellRec, *TransientShellWidget;
+
+/***********************************************************************
+ *
+ * TopLevelShell Widget Private Data
+ *
+ ***********************************************************************/
+
+/* New fields for the TopLevelShell widget class record */
+
+typedef struct {
+    XtPointer       extension;          /* pointer to extension record      */
+} TopLevelShellClassPart;
+
+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;
+
+externalref TopLevelShellClassRec topLevelShellClassRec;
+
+/* New fields for the top level shell widget */
+
+typedef struct {
+       char       *icon_name;
+       Boolean     iconic;
+       Atom        icon_name_encoding;
+} TopLevelShellPart;
+
+typedef  struct {
+       CorePart        core;
+       CompositePart   composite;
+       ShellPart       shell;
+       WMShellPart     wm;
+       VendorShellPart vendor;
+       TopLevelShellPart topLevel;
+} TopLevelShellRec, *TopLevelShellWidget;
+
+/***********************************************************************
+ *
+ * ApplicationShell Widget Private Data
+ *
+ ***********************************************************************/
+
+/* New fields for the ApplicationShell widget class record */
+
+typedef struct {
+    XtPointer       extension;          /* pointer to extension record      */
+} ApplicationShellClassPart;
+
+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;
+
+externalref ApplicationShellClassRec applicationShellClassRec;
+
+/* New fields for the application shell widget */
+
+typedef struct {
+#if defined(__cplusplus) || defined(c_plusplus)
+    char *c_class;
+#else
+    char *class;
+#endif
+    XrmClass xrm_class;
+    int argc;
+    char **argv;
+} ApplicationShellPart;
+
+typedef  struct {
+       CorePart        core;
+       CompositePart   composite;
+       ShellPart       shell;
+       WMShellPart     wm;
+       VendorShellPart vendor;
+       TopLevelShellPart topLevel;
+       ApplicationShellPart application;
+} ApplicationShellRec, *ApplicationShellWidget;
+
+/***********************************************************************
+ *
+ * SessionShell Widget Private Data
+ *
+ ***********************************************************************/
+
+/* New fields for the SessionShell widget class record */
+
+typedef struct {
+    XtPointer       extension;          /* pointer to extension record */
+} SessionShellClassPart;
+
+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;
+
+externalref SessionShellClassRec sessionShellClassRec;
+
+typedef struct _XtSaveYourselfRec *XtSaveYourself; /* implementation-private */
+
+/* New fields for the session shell widget */
+
+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;
+    unsigned char   checkpoint_state;
+    Boolean         join_session;
+    XtCallbackList  save_callbacks;
+    XtCallbackList  interact_callbacks;
+    XtCallbackList  cancel_callbacks;
+    XtCallbackList  save_complete_callbacks;
+    XtCallbackList  die_callbacks;
+    XtCallbackList  error_callbacks;
+    XtSaveYourself  save;
+    XtInputId       input_id;
+    XtPointer       ses20;
+    XtPointer       ses19;
+    XtPointer       ses18;
+    XtPointer       ses17;
+    XtPointer       ses16;
+    XtPointer       ses15;
+    XtPointer       ses14;
+    XtPointer       ses13;
+    XtPointer       ses12;
+    XtPointer       ses11;
+    XtPointer       ses10;
+    XtPointer       ses9;
+    XtPointer       ses8;
+    XtPointer       ses7;
+    XtPointer       ses6;
+    XtPointer       ses5;
+    XtPointer       ses4;
+    XtPointer       ses3;
+    XtPointer       ses2;
+    XtPointer       ses1;
+} SessionShellPart;
+
+typedef  struct {
+       CorePart        core;
+       CompositePart   composite;
+       ShellPart       shell;
+       WMShellPart     wm;
+       VendorShellPart vendor;
+       TopLevelShellPart topLevel;
+       ApplicationShellPart application;
+       SessionShellPart session;
+} SessionShellRec, *SessionShellWidget;
+
+_XFUNCPROTOEND
+
+#endif /* _XtShellPrivate_h */
diff --git a/include/X11/ThreadsI.h b/include/X11/ThreadsI.h
new file mode 100644 (file)
index 0000000..ff6dee3
--- /dev/null
@@ -0,0 +1,129 @@
+/************************************************************
+
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+********************************************************/
+
+/*
+
+Copyright 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+/* $XFree86: xc/lib/Xt/ThreadsI.h,v 3.5 2001/12/14 19:56:31 dawes Exp $ */
+
+#ifndef _XtThreadsI_h
+#define _XtThreadsI_h
+
+#include <X11/XlibConf.h>
+
+#ifdef XTHREADS
+
+typedef struct _LockRec *LockPtr;
+
+typedef void (*ThreadAppProc)(
+    XtAppContext /* app */
+);
+
+typedef void (*ThreadAppYieldLockProc)(
+    XtAppContext, /* app */
+    Boolean*, /* push_thread */
+    Boolean*, /* pushed_thread */
+    int* /* level */
+);
+
+typedef void (*ThreadAppRestoreLockProc)(
+    XtAppContext /* app */,
+    int, /* level */
+    Boolean* /* pushed_thread */
+);
+
+_XFUNCPROTOBEGIN
+
+extern void (*_XtProcessLock)(
+    void
+);
+
+extern void (*_XtProcessUnlock)(
+    void
+);
+
+extern void (*_XtInitAppLock)(
+    XtAppContext /* app */
+);
+
+_XFUNCPROTOEND
+
+#define INIT_APP_LOCK(app) if(_XtInitAppLock) (*_XtInitAppLock)(app)
+#define FREE_APP_LOCK(app) if(app && app->free_lock)(*app->free_lock)(app)
+
+#define LOCK_PROCESS if(_XtProcessLock)(*_XtProcessLock)()
+#define UNLOCK_PROCESS if(_XtProcessUnlock)(*_XtProcessUnlock)()
+#define LOCK_APP(app) if(app && app->lock)(*app->lock)(app)
+#define UNLOCK_APP(app) if(app && app->unlock)(*app->unlock)(app)
+
+#define YIELD_APP_LOCK(app,push,pushed,level)\
+        if(app && app->yield_lock) (*app->yield_lock)(app,push,pushed,level)
+#define RESTORE_APP_LOCK(app,level,pushed)\
+        if(app && app->restore_lock) (*app->restore_lock)(app,level,pushed)
+
+#define WIDGET_TO_APPCON(w) \
+    XtAppContext app = (w && _XtProcessLock ? \
+       XtWidgetToApplicationContext(w) : NULL)
+
+#define DPY_TO_APPCON(d) \
+    XtAppContext app = (_XtProcessLock ? XtDisplayToApplicationContext(d): NULL)
+
+#else /* defined(XTHREADS) */
+
+#define LOCK_PROCESS
+#define UNLOCK_PROCESS
+#define LOCK_APP(app)
+#define UNLOCK_APP(app)
+
+#define INIT_APP_LOCK(app)
+#define FREE_APP_LOCK(app)
+
+#define WIDGET_TO_APPCON(w)
+#define DPY_TO_APPCON(d)
+
+#endif /* !defined(XTHREADS) */
+#endif /* _XtThreadsI_h */
diff --git a/include/X11/TranslateI.h b/include/X11/TranslateI.h
new file mode 100644 (file)
index 0000000..7da70b9
--- /dev/null
@@ -0,0 +1,606 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+ * TranslateI.h - Header file private to translation management
+ *
+ * Author:     Gabe Beged-Dov, HP
+ *
+ * Former Author:      Charles Haynes
+ *             Digital Equipment Corporation
+ *             Western Research Laboratory
+ * Date:       Sat Aug 29 1987
+ */
+
+/*#define REFCNT_TRANSLATIONS*/
+#define CACHE_TRANSLATIONS
+
+#define TM_NO_MATCH (-2)
+
+#define _XtRStateTablePair "_XtStateTablePair"
+
+typedef unsigned char TMByteCard;
+typedef unsigned short TMShortCard;
+typedef unsigned long TMLongCard;
+typedef short TMShortInt;
+
+typedef struct _TMTypeMatchRec *TMTypeMatch;
+typedef struct _TMModifierMatchRec *TMModifierMatch;
+typedef struct _TMEventRec *TMEventPtr;
+
+typedef Boolean (*MatchProc)(TMTypeMatch typeMatch,
+                            TMModifierMatch modMatch,
+                            TMEventPtr eventSeq);
+
+typedef struct _ModToKeysymTable {
+    Modifiers mask;
+    int count;
+    int idx;
+} ModToKeysymTable;
+
+typedef struct _LateBindings {
+    unsigned int knot:1;
+    unsigned int pair:1;
+    unsigned short ref_count;  /* garbage collection */
+    KeySym keysym;
+} LateBindings, *LateBindingsPtr;
+
+typedef short ModifierMask;
+
+typedef struct _ActionsRec *ActionPtr;
+typedef struct _ActionsRec {
+    int idx;                   /* index into quarkTable to find proc */
+    String *params;            /* pointer to array of params */
+    Cardinal num_params;       /* number of params */
+    ActionPtr next;            /* next action to perform */
+} ActionRec;
+
+typedef struct _XtStateRec *StatePtr;
+typedef struct _XtStateRec {
+    unsigned int       isCycleStart:1;
+    unsigned int       isCycleEnd:1;
+    TMShortCard                typeIndex;
+    TMShortCard                modIndex;
+    ActionPtr          actions;        /* rhs list of actions to perform */
+    StatePtr           nextLevel;
+}StateRec;
+
+
+#define XtTableReplace 0
+#define XtTableAugment 1
+#define XtTableOverride        2
+#define XtTableUnmerge  3
+
+typedef unsigned int _XtTranslateOp;
+
+/*
+ * New Definitions
+ */
+typedef struct _TMModifierMatchRec{
+    TMLongCard  modifiers;
+    TMLongCard  modifierMask;
+    LateBindingsPtr lateModifiers;
+    Boolean     standard;
+}TMModifierMatchRec;
+
+typedef struct _TMTypeMatchRec{
+    TMLongCard  eventType;
+    TMLongCard  eventCode;
+    TMLongCard  eventCodeMask;
+    MatchProc   matchEvent;
+}TMTypeMatchRec;
+
+typedef struct _TMBranchHeadRec {
+    unsigned int       isSimple:1;
+    unsigned int       hasActions:1;
+    unsigned int       hasCycles:1;
+    unsigned int       more:13;
+    TMShortCard                typeIndex;
+    TMShortCard                modIndex;
+}TMBranchHeadRec, *TMBranchHead;
+
+/* NOTE: elements of this structure must match those of
+ * TMComplexStateTreeRec and TMParseStateTreeRec.
+ */
+typedef struct _TMSimpleStateTreeRec{
+    unsigned int       isSimple:1;
+    unsigned int       isAccelerator:1;
+    unsigned int       mappingNotifyInterest:1;
+    unsigned int       refCount:13;
+    TMShortCard                numBranchHeads;
+    TMShortCard                numQuarks;   /* # of entries in quarkTbl */
+    TMShortCard                unused;      /* to ensure same alignment */
+    TMBranchHeadRec    *branchHeadTbl;
+    XrmQuark           *quarkTbl;  /* table of quarkified rhs*/
+}TMSimpleStateTreeRec, *TMSimpleStateTree;
+
+/* NOTE: elements of this structure must match those of
+ * TMSimpleStateTreeRec and TMParseStateTreeRec.
+ */
+typedef struct _TMComplexStateTreeRec{
+    unsigned int       isSimple:1;
+    unsigned int       isAccelerator:1;
+    unsigned int       mappingNotifyInterest:1;
+    unsigned int       refCount:13;
+    TMShortCard                numBranchHeads;
+    TMShortCard                numQuarks;   /* # of entries in quarkTbl */
+    TMShortCard                numComplexBranchHeads;
+    TMBranchHeadRec    *branchHeadTbl;
+    XrmQuark           *quarkTbl;  /* table of quarkified rhs*/
+    StatePtr           *complexBranchHeadTbl;
+}TMComplexStateTreeRec, *TMComplexStateTree;
+
+/* NOTE: elements of this structure must match those of
+ * TMSimpleStateTreeRec and TMComplexStateTreeRec.
+ */
+typedef struct _TMParseStateTreeRec{
+    unsigned int       isSimple:1;
+    unsigned int       isAccelerator:1;
+    unsigned int       mappingNotifyInterest:1;
+    unsigned int       isStackQuarks:1;
+    unsigned int       isStackBranchHeads:1;
+    unsigned int       isStackComplexBranchHeads:1;
+    unsigned int       unused:10; /* to ensure correct alignment */
+    TMShortCard                numBranchHeads;
+    TMShortCard                numQuarks;   /* # of entries in quarkTbl */
+    TMShortCard                numComplexBranchHeads;
+    TMBranchHeadRec    *branchHeadTbl;
+    XrmQuark           *quarkTbl;  /* table of quarkified rhs*/
+    StatePtr           *complexBranchHeadTbl;
+    TMShortCard                branchHeadTblSize;
+    TMShortCard                quarkTblSize; /*total size of quarkTbl */
+    TMShortCard                complexBranchHeadTblSize;
+    StatePtr           head;
+}TMParseStateTreeRec, *TMParseStateTree;
+
+typedef union _TMStateTreeRec{
+    TMSimpleStateTreeRec       simple;
+    TMParseStateTreeRec                parse;
+    TMComplexStateTreeRec      complex;
+}*TMStateTree, **TMStateTreePtr, **TMStateTreeList;
+
+typedef struct _TMSimpleBindProcsRec {
+    XtActionProc       *procs;
+}TMSimpleBindProcsRec, *TMSimpleBindProcs;
+
+typedef struct _TMComplexBindProcsRec {
+    Widget             widget;         /*widgetID to pass to action Proc*/
+    XtTranslations     aXlations;
+    XtActionProc       *procs;
+}TMComplexBindProcsRec, *TMComplexBindProcs;
+
+typedef struct _TMSimpleBindDataRec {
+    unsigned int               isComplex:1;    /* must be first */
+    TMSimpleBindProcsRec       bindTbl[1];     /* variable length */
+}TMSimpleBindDataRec, *TMSimpleBindData;
+
+typedef struct _TMComplexBindDataRec {
+    unsigned int               isComplex:1;    /* must be first */
+    struct _ATranslationData   *accel_context; /* for GetValues */
+    TMComplexBindProcsRec      bindTbl[1];     /* variable length */
+}TMComplexBindDataRec, *TMComplexBindData;
+
+typedef union _TMBindDataRec{
+    TMSimpleBindDataRec                simple;
+    TMComplexBindDataRec       complex;
+}*TMBindData;
+
+typedef struct _TranslationData{
+    unsigned char              hasBindings;    /* must be first */
+    unsigned char              operation; /*replace,augment,override*/
+    TMShortCard                        numStateTrees;
+    struct _TranslationData            *composers[2];
+    EventMask                  eventMask;
+    TMStateTree                        stateTreeTbl[1]; /* variable length */
+}TranslationData;
+
+/*
+ * ATranslations is returned by GetValues for translations that contain
+ * accelerators.  The TM can differentiate between this and TranslationData
+ * (that don't have a bindTbl) by looking at the first field (hasBindings)
+ * of either structure.  All ATranslationData structures associated with a
+ * widget are chained off the BindData record of the widget.
+ */
+typedef struct _ATranslationData{
+    unsigned char              hasBindings;    /* must be first */
+    unsigned char              operation;
+    struct _TranslationData    *xlations;  /* actual translations */
+    struct _ATranslationData   *next;      /* chain the contexts together */
+    TMComplexBindProcsRec      bindTbl[1]; /* accelerator bindings */
+}ATranslationData, *ATranslations;
+
+typedef struct _TMConvertRec {
+    XtTranslations     old; /* table to merge into */
+    XtTranslations     new; /* table to merge from */
+} TMConvertRec;
+
+#define _XtEventTimerEventType ((TMLongCard)~0L)
+#define KeysymModMask          (1L<<27) /* private to TM */
+#define AnyButtonMask          (1L<<28) /* private to TM */
+
+typedef struct _EventRec {
+    TMLongCard modifiers;
+    TMLongCard modifierMask;
+    LateBindingsPtr lateModifiers;
+    TMLongCard eventType;
+    TMLongCard eventCode;
+    TMLongCard eventCodeMask;
+    MatchProc matchEvent;
+    Boolean standard;
+} Event;
+
+typedef struct _EventSeqRec *EventSeqPtr;
+typedef struct _EventSeqRec {
+    Event event;       /* X event description */
+    StatePtr state;    /* private to state table builder */
+    EventSeqPtr next;  /* next event on line */
+    ActionPtr actions; /* r.h.s.   list of actions to perform */
+} EventSeqRec;
+
+typedef EventSeqRec EventRec;
+typedef EventSeqPtr EventPtr;
+
+typedef struct _TMEventRec {
+    XEvent *xev;
+    Event event;
+}TMEventRec;
+
+typedef struct _ActionHookRec {
+    struct _ActionHookRec* next; /* must remain first */
+    XtAppContext app;
+    XtActionHookProc proc;
+    XtPointer closure;
+} ActionHookRec, *ActionHook;
+
+/* choose a number between 2 and 8 */
+#define TMKEYCACHELOG2 6
+#define TMKEYCACHESIZE (1<<TMKEYCACHELOG2)
+
+typedef struct _KeyCacheRec {
+    unsigned char modifiers_return[256]; /* constant per KeyCode, key proc */
+    KeyCode keycode[TMKEYCACHESIZE];
+    unsigned char modifiers[TMKEYCACHESIZE];
+    KeySym keysym[TMKEYCACHESIZE];
+} TMKeyCache;
+
+typedef struct _TMKeyContextRec {
+    XEvent *event;
+    unsigned long serial;
+    KeySym keysym;
+    Modifiers modifiers;
+    TMKeyCache keycache;  /* keep this last, to keep offsets to others small */
+} TMKeyContextRec, *TMKeyContext;
+
+typedef struct _TMGlobalRec{
+    TMTypeMatchRec             **typeMatchSegmentTbl;
+    TMShortCard                        numTypeMatches;
+    TMShortCard                        numTypeMatchSegments;
+    TMShortCard                        typeMatchSegmentTblSize;
+    TMModifierMatchRec                 **modMatchSegmentTbl;
+    TMShortCard                        numModMatches;
+    TMShortCard                        numModMatchSegments;
+    TMShortCard                        modMatchSegmentTblSize;
+    Boolean                    newMatchSemantics;
+#ifdef TRACE_TM
+    XtTranslations             *tmTbl;
+    TMShortCard                        numTms;
+    TMShortCard                        tmTblSize;
+    struct _TMBindCacheRec     **bindCacheTbl;
+    TMShortCard                        numBindCache;
+    TMShortCard                        bindCacheTblSize;
+    TMShortCard                        numLateBindings;
+    TMShortCard                        numBranchHeads;
+    TMShortCard                        numComplexStates;
+    TMShortCard                        numComplexActions;
+#endif /* TRACE_TM */
+}TMGlobalRec;
+
+_XFUNCPROTOBEGIN
+
+extern TMGlobalRec _XtGlobalTM;
+
+#define TM_MOD_SEGMENT_SIZE    16
+#define TM_TYPE_SEGMENT_SIZE   16
+
+#define TMGetTypeMatch(idx) \
+  ((TMTypeMatch) \
+   &((_XtGlobalTM.typeMatchSegmentTbl[((idx) >> 4)])[(idx) & 15]))
+#define TMGetModifierMatch(idx) \
+  ((TMModifierMatch) \
+   &((_XtGlobalTM.modMatchSegmentTbl[(idx) >> 4])[(idx) & 15]))
+
+/* Useful Access Macros */
+#define TMNewMatchSemantics() (_XtGlobalTM.newMatchSemantics)
+#define TMBranchMore(branch) (branch->more)
+#define TMComplexBranchHead(tree, br) \
+  (((TMComplexStateTree)tree)->complexBranchHeadTbl[TMBranchMore(br)])
+
+#define TMGetComplexBindEntry(bindData, idx) \
+  ((TMComplexBindProcs)&(((TMComplexBindData)bindData)->bindTbl[idx]))
+
+#define TMGetSimpleBindEntry(bindData, idx) \
+  ((TMSimpleBindProcs)&(((TMSimpleBindData)bindData)->bindTbl[idx]))
+
+
+#define _InitializeKeysymTables(dpy, pd) \
+    if (pd->keysyms == NULL) \
+        _XtBuildKeysymTables(dpy, pd)
+
+/*
+ * Internal Functions
+ */
+
+extern void _XtPopup(
+    Widget      /* widget */,
+    XtGrabKind  /* grab_kind */,
+    _XtBoolean /* spring_loaded */
+);
+
+extern String _XtPrintXlations(
+    Widget             /* w */,
+    XtTranslations     /* xlations */,
+    Widget             /* accelWidget */,
+    _XtBoolean         /* includeRHS */
+);
+
+extern void _XtRegisterGrabs(
+    Widget     /* widget */
+);
+
+extern XtPointer _XtInitializeActionData(
+    struct _XtActionsRec *     /* actions */,
+    Cardinal                   /* count */,
+    _XtBoolean                 /* inPlace */
+);
+
+extern void _XtAddEventSeqToStateTree(
+    EventSeqPtr                /* eventSeq */,
+    TMParseStateTree   /* stateTree */
+);
+
+extern Boolean _XtMatchUsingStandardMods(
+    TMTypeMatch                /* typeMatch */,
+    TMModifierMatch    /* modMatch */,
+    TMEventPtr         /* eventSeq */
+);
+
+extern Boolean _XtMatchUsingDontCareMods(
+    TMTypeMatch                /* typeMatch */,
+    TMModifierMatch    /* modMatch */,
+    TMEventPtr         /* eventSeq */
+);
+
+extern Boolean _XtRegularMatch(
+    TMTypeMatch                /* typeMatch */,
+    TMModifierMatch    /* modMatch */,
+    TMEventPtr         /* eventSeq */
+);
+
+extern Boolean _XtMatchAtom(
+    TMTypeMatch                /* typeMatch */,
+    TMModifierMatch    /* modMatch */,
+    TMEventPtr         /* eventSeq */
+);
+
+extern void _XtTranslateEvent(
+    Widget             /* widget */,
+    XEvent*            /* event */
+);
+
+#include "CallbackI.h"
+#include "EventI.h"
+#include "HookObjI.h"
+#include "PassivGraI.h"
+#include "ThreadsI.h"
+#include "InitialI.h"
+#include "ResourceI.h"
+#include "StringDefs.h"
+
+extern void _XtBuildKeysymTables(Display *dpy, XtPerDisplay pd);
+
+#ifndef NO_MIT_HACKS
+extern void  _XtDisplayTranslations(
+    Widget             /* widget */,
+    XEvent*            /* event */,
+    String*            /* params */,
+    Cardinal*          /* num_params */
+);
+
+extern void  _XtDisplayAccelerators(
+    Widget             /* widget */,
+    XEvent*            /* event */,
+    String*            /* params */,
+    Cardinal*          /* num_params */
+);
+
+extern void _XtDisplayInstalledAccelerators(
+    Widget             /* widget */,
+    XEvent*            /* event */,
+    String*            /* params */,
+    Cardinal*          /* num_params */
+);
+#endif /* ifndef NO_MIT_HACKS */
+
+extern void _XtPopupInitialize(
+    XtAppContext       /* app_context */
+);
+
+extern void _XtBindActions(
+    Widget     /* widget */,
+    XtTM       /* tm_rec */
+);
+
+extern Boolean _XtComputeLateBindings(
+    Display*           /* dpy */,
+    LateBindingsPtr    /* lateModifiers */,
+    Modifiers*         /* computed */,
+    Modifiers*         /* computedMask */
+);
+
+extern XtTranslations _XtCreateXlations(
+    TMStateTree *      /* stateTrees */,
+    TMShortCard                /* numStateTrees */,
+    XtTranslations     /* first */,
+    XtTranslations     /* second */
+);
+
+extern Boolean _XtCvtMergeTranslations(
+    Display*   /* dpy */,
+    XrmValuePtr        /* args */,
+    Cardinal*  /* num_args */,
+    XrmValuePtr        /* from */,
+    XrmValuePtr        /* to */,
+    XtPointer* /* closure_ret */
+);
+
+void _XtRemoveStateTreeByIndex(
+    XtTranslations     /* xlations */,
+    TMShortCard        /* i */);
+
+void _XtFreeTranslations(
+    XtAppContext       /* app */,
+    XrmValuePtr                /* toVal */,
+    XtPointer          /* closure */,
+    XrmValuePtr                /* args */,
+    Cardinal*          /* num_args */
+);
+
+extern TMShortCard _XtGetModifierIndex(
+    Event*     /* event */
+);
+
+extern TMShortCard _XtGetQuarkIndex(
+    TMParseStateTree   /* stateTreePtr */,
+    XrmQuark           /* quark */
+);
+
+extern XtTranslations _XtGetTranslationValue(
+    Widget             /* widget */
+);
+
+extern TMShortCard _XtGetTypeIndex(
+    Event*     /* event */
+);
+
+extern void _XtGrabInitialize(
+    XtAppContext       /* app */
+);
+
+extern void _XtInstallTranslations(
+    Widget             /* widget */
+);
+
+extern void _XtRemoveTranslations(
+    Widget             /* widget */
+);
+
+extern void _XtDestroyTMData(
+    Widget             /* widget */
+);
+
+extern void _XtMergeTranslations(
+    Widget             /* widget */,
+    XtTranslations     /* newXlations */,
+    _XtTranslateOp     /* operation */
+);
+
+extern void _XtActionInitialize(
+    XtAppContext       /* app */
+);
+
+extern TMStateTree _XtParseTreeToStateTree(
+    TMParseStateTree   /* parseTree */
+);
+
+extern String _XtPrintActions(
+    ActionRec* /* actions */,
+    XrmQuark*  /* quarkTbl */
+);
+
+extern String _XtPrintState(
+    TMStateTree        /* stateTree */,
+    TMBranchHead /* branchHead */);
+
+extern String _XtPrintEventSeq(
+    EventSeqPtr        /* eventSeq */,
+    Display*   /* dpy */
+);
+
+typedef Boolean (*_XtTraversalProc)(
+    StatePtr   /* state */,
+    XtPointer  /* data */
+);
+
+extern void _XtTraverseStateTree(
+    TMStateTree                /* tree */,
+    _XtTraversalProc   /* func */,
+    XtPointer          /* data */
+);
+
+extern void _XtTranslateInitialize(
+    void
+);
+
+extern void _XtAddTMConverters(
+    ConverterTable     /* table */
+);
+
+extern void _XtUnbindActions(
+    Widget             /* widget */,
+    XtTranslations     /* xlations */,
+    TMBindData         /* bindData */
+);
+
+extern void _XtUnmergeTranslations(
+    Widget             /* widget */,
+    XtTranslations     /* xlations */
+);
+
+/* TMKey.c */
+extern void _XtAllocTMContext(XtPerDisplay pd);
+
+_XFUNCPROTOEND
diff --git a/include/X11/VarargsI.h b/include/X11/VarargsI.h
new file mode 100644 (file)
index 0000000..790a271
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+
+Copyright 1985, 1986, 1987, 1988, 1989, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifndef _VarargsI_h_
+#define _VarargsI_h_
+
+#include <stdarg.h>
+
+/* private routines */
+
+_XFUNCPROTOBEGIN
+
+extern void _XtCountVaList(
+    va_list /*var*/, int* /*total_count*/, int* /*typed_count*/
+);
+
+extern void _XtVaToArgList(
+   Widget /*widget*/, va_list /*var*/, int /*max_count*/, ArgList* /*args_return*/, Cardinal* /*num_args_return*/
+);
+
+extern void _XtVaToTypedArgList(
+    va_list /*var*/, int /*count*/, XtTypedArgList* /*args_return*/, Cardinal* /*num_args_return*/
+);
+
+extern XtTypedArgList _XtVaCreateTypedArgList(
+    va_list /*var*/, int /*count*/
+);
+
+extern void _XtFreeArgList(
+    ArgList /*args*/, int /*total_count*/, int /*typed_count*/
+);
+
+extern void _XtGetApplicationResources(
+    Widget /*w*/, XtPointer /*base*/, XtResourceList /*resources*/, Cardinal /*num_resources*/, ArgList /*args*/, Cardinal /*num_args*/, XtTypedArgList /*typed_args*/, Cardinal /*num_typed_args*/
+);
+
+extern void _XtGetSubresources(
+    Widget /*w*/, XtPointer /*base*/, const char* /*name*/, const char* /*class*/, XtResourceList /*resources*/, Cardinal /*num_resources*/, ArgList /*args*/, Cardinal /*num_args*/, XtTypedArgList /*typed_args*/, Cardinal /*num_typed_args*/
+);
+
+_XFUNCPROTOEND
+
+#endif /* _VarargsI_h_ */
diff --git a/include/X11/Vendor.h b/include/X11/Vendor.h
new file mode 100644 (file)
index 0000000..6d783c6
--- /dev/null
@@ -0,0 +1,70 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifndef _XtVendor_h
+#define _XtVendor_h
+
+#include <X11/Intrinsic.h>
+
+/***********************************************************************
+ *
+ * VendorShell Widget
+ *
+ ***********************************************************************/
+
+/* Class record constants */
+
+typedef struct _VendorShellClassRec *VendorShellWidgetClass;
+
+_XFUNCPROTOBEGIN
+
+externalref WidgetClass vendorShellWidgetClass;
+
+_XFUNCPROTOEND
+
+#endif /* _XtVendor_h */
+/* DON'T ADD STUFF AFTER THIS #endif */
diff --git a/include/X11/VendorP.h b/include/X11/VendorP.h
new file mode 100644 (file)
index 0000000..4eb9404
--- /dev/null
@@ -0,0 +1,102 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+ * VendorP.h - Private definitions for VendorShell widget
+ *
+ * Author:     Paul Asente
+ *             Digital Equipment Corporation
+ *             Western Software Laboratory
+ * Date:       Thu Dec 3, 1987
+ */
+
+/***********************************************************************
+ *
+ * VendorShell Widget Private Data
+ *
+ ***********************************************************************/
+
+#ifndef  _XtVendorPrivate_h
+#define _XtVendorPrivate_h
+
+#include <X11/Vendor.h>
+
+/* New fields for the VendorShell widget class record */
+
+_XFUNCPROTOBEGIN
+
+typedef struct {
+    XtPointer       extension;          /* pointer to extension record      */
+} VendorShellClassPart;
+
+typedef struct _VendorShellClassRec {
+       CoreClassPart      core_class;
+       CompositeClassPart composite_class;
+       ShellClassPart  shell_class;
+       WMShellClassPart   wm_shell_class;
+       VendorShellClassPart vendor_shell_class;
+} VendorShellClassRec;
+
+externalref VendorShellClassRec vendorShellClassRec;
+
+/* New fields for the vendor shell widget. */
+
+typedef struct {
+       int             vendor_specific;
+} VendorShellPart;
+
+typedef  struct {
+       CorePart        core;
+       CompositePart   composite;
+       ShellPart       shell;
+       WMShellPart     wm;
+       VendorShellPart vendor;
+} VendorShellRec, *VendorShellWidget;
+
+_XFUNCPROTOEND
+
+#endif  /* _XtVendorPrivate_h */
diff --git a/include/X11/Xtos.h b/include/X11/Xtos.h
new file mode 100644 (file)
index 0000000..7079321
--- /dev/null
@@ -0,0 +1,72 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifndef _Xtos_h
+#define _Xtos_h
+
+#define ALLOCATE_LOCAL_FALLBACK(_size) XtMalloc((unsigned long)(_size))
+#define DEALLOCATE_LOCAL_FALLBACK(_ptr) XtFree((XtPointer)(_ptr))
+#include <X11/Xalloca.h>
+
+#ifdef CRAY
+#define WORD64
+#endif
+
+#if defined (_LP64) || \
+    defined(__alpha) || defined(__alpha__) || \
+    defined(__ia64__) || defined(ia64) || \
+    defined(__sparc64__) || \
+    defined(__s390x__) || \
+    (defined(__hppa__) && defined(__LP64__)) || \
+    defined(__amd64__) || defined(amd64) || \
+    defined(__powerpc64__) || \
+    (defined(sgi) && (_MIPS_SZLONG == 64))
+#define LONG64
+#endif
+
+#endif /* _Xtos_h */
+/* DON'T ADD STUFF AFTER THIS #endif */
diff --git a/m4/ax_define_dir.m4 b/m4/ax_define_dir.m4
new file mode 100644 (file)
index 0000000..b74d155
--- /dev/null
@@ -0,0 +1,49 @@
+# ===========================================================================
+#       http://www.gnu.org/software/autoconf-archive/ax_define_dir.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_DEFINE_DIR(VARNAME, DIR [, DESCRIPTION])
+#
+# DESCRIPTION
+#
+#   This macro sets VARNAME to the expansion of the DIR variable, taking
+#   care of fixing up ${prefix} and such.
+#
+#   VARNAME is then offered as both an output variable and a C preprocessor
+#   symbol.
+#
+#   Example:
+#
+#     AX_DEFINE_DIR([DATADIR], [datadir], [Where data are placed to.])
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Stepan Kasal <kasal@ucw.cz>
+#   Copyright (c) 2008 Andreas Schwab <schwab@suse.de>
+#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
+#   Copyright (c) 2008 Alexandre Oliva
+#
+#   Copying and distribution of this file, with or without modification, are
+#   permitted in any medium without royalty provided the copyright notice
+#   and this notice are preserved. This file is offered as-is, without any
+#   warranty.
+
+#serial 6
+
+AU_ALIAS([AC_DEFINE_DIR], [AX_DEFINE_DIR])
+AC_DEFUN([AX_DEFINE_DIR], [
+  prefix_NONE=
+  exec_prefix_NONE=
+  test "x$prefix" = xNONE && prefix_NONE=yes && prefix=$ac_default_prefix
+  test "x$exec_prefix" = xNONE && exec_prefix_NONE=yes && exec_prefix=$prefix
+dnl In Autoconf 2.60, ${datadir} refers to ${datarootdir}, which in turn
+dnl refers to ${prefix}.  Thus we have to use `eval' twice.
+  eval ax_define_dir="\"[$]$2\""
+  eval ax_define_dir="\"$ax_define_dir\""
+  AC_SUBST($1, "$ax_define_dir")
+  AC_DEFINE_UNQUOTED($1, "$ax_define_dir", [$3])
+  test "$prefix_NONE" && prefix=NONE
+  test "$exec_prefix_NONE" && exec_prefix=NONE
+])
diff --git a/man/Makefile.am b/man/Makefile.am
new file mode 100644 (file)
index 0000000..305598d
--- /dev/null
@@ -0,0 +1,492 @@
+libmandir = $(LIB_MAN_DIR)
+
+libman_PRE =                                   \
+       $(all_shadows:=.man)                    \
+       XtAddActions.man                        \
+       XtAddCallback.man                       \
+       XtAddEventHandler.man                   \
+       XtAddExposureToRegion.man               \
+       XtAddGrab.man                           \
+       XtAddInput.man                          \
+       XtAllocateGC.man                        \
+       XtAppAddActionHook.man                  \
+       XtAppAddActions.man                     \
+       XtAppAddBlockHook.man                   \
+       XtAppAddConverter.man                   \
+       XtAppAddInput.man                       \
+       XtAppAddSignal.man                      \
+       XtAppAddTimeOut.man                     \
+       XtAppAddWorkProc.man                    \
+       XtAppCreateShell.man                    \
+       XtAppError.man                          \
+       XtAppErrorMsg.man                       \
+       XtAppGetErrorDatabase.man               \
+       XtAppGetSelectionTimeout.man            \
+       XtAppInitialize.man                     \
+       XtAppLock.man                           \
+       XtAppNextEvent.man                      \
+       XtAppReleaseCacheRefs.man               \
+       XtAppSetExitFlag.man                    \
+       XtAppSetFallbackResources.man           \
+       XtAppSetTypeConverter.man               \
+       XtBuildEventMask.man                    \
+       XtCallAcceptFocus.man                   \
+       XtCallActionProc.man                    \
+       XtCallCallbacks.man                     \
+       XtClass.man                             \
+       XtConfigureWidget.man                   \
+       XtConvert.man                           \
+       XtConvertAndStore.man                   \
+       XtCreateApplicationContext.man          \
+       XtCreateApplicationShell.man            \
+       XtCreatePopupShell.man                  \
+       XtCreateSelectionRequest.man            \
+       XtCreateWidget.man                      \
+       XtCreateWindow.man                      \
+       XtDisplay.man                           \
+       XtDisplayInitialize.man                 \
+       XtDisplayStringConversionWarning.man    \
+       XtDisplayToApplicationContext.man       \
+       XtError.man                             \
+       XtErrorMsg.man                          \
+       XtFindFile.man                          \
+       XtGetActionKeysym.man                   \
+       XtGetActionList.man                     \
+       XtGetApplicationNameAndClass.man        \
+       XtGetApplicationResources.man           \
+       XtGetClassExtension.man                 \
+       XtGetDisplays.man                       \
+       XtGetErrorDatabase.man                  \
+       XtGetGC.man                             \
+       XtGetKeyboardFocusWidget.man            \
+       XtGetKeysymTable.man                    \
+       XtGetResourceList.man                   \
+       XtGetSelectionParameters.man            \
+       XtGetSelectionRequest.man               \
+       XtGetSelectionTimeout.man               \
+       XtGetSelectionValue.man                 \
+       XtGetSelectionValueIncremental.man      \
+       XtGetSubresources.man                   \
+       XtGrabKey.man                           \
+       XtHooksOfDisplay.man                    \
+       XtInitialize.man                        \
+       XtInitializeWidgetClass.man             \
+       XtInsertEventTypeHandler.man            \
+       XtLastEventProcessed.man                \
+       XtMakeGeometryRequest.man               \
+       XtMalloc.man                            \
+       XtManageChildren.man                    \
+       XtMapWidget.man                         \
+       XtName.man                              \
+       XtNameToWidget.man                      \
+       XtNextEvent.man                         \
+       XtOffset.man                            \
+       XtOpenApplication.man                   \
+       XtOwnSelection.man                      \
+       XtParent.man                            \
+       XtParseAcceleratorTable.man             \
+       XtParseTranslationTable.man             \
+       XtPopdown.man                           \
+       XtPopup.man                             \
+       XtProcessLock.man                       \
+       XtQueryGeometry.man                     \
+       XtRealizeWidget.man                     \
+       XtRegisterDrawable.man                  \
+       XtRegisterGrabAction.man                \
+       XtReservePropertyAtom.man               \
+       XtResolvePathname.man                   \
+       XtSessionGetToken.man                   \
+       XtSetArg.man                            \
+       XtSetKeyTranslator.man                  \
+       XtSetKeyboardFocus.man                  \
+       XtSetLanguageProc.man                   \
+       XtSetMultiClickTime.man                 \
+       XtSetSelectionParameters.man            \
+       XtSetSensitive.man                      \
+       XtSetValues.man                         \
+       XtSetWMColormapWindows.man              \
+       XtStringConversionWarning.man           \
+       XtToolkitThreadInitialize.man           \
+       XtTranslateCoords.man                   \
+       XtVaCreateArgsList.man
+
+libman_DATA = $(libman_PRE:man=@LIB_MAN_SUFFIX@)
+
+EXTRA_DIST = $(libman_PRE)
+CLEANFILES = $(libman_DATA)
+
+SUFFIXES = .$(LIB_MAN_SUFFIX) .man
+
+all_shadows =                                  \
+       $(XtAddCallback_shadows)                \
+       $(XtAddEventHandler_shadows)            \
+       $(XtAddGrab_shadows)                    \
+       $(XtAppAddConverter_shadows)            \
+       $(XtAppAddInput_shadows)                \
+       $(XtAppAddTimeOut_shadows)              \
+       $(XtAppAddWorkProc_shadows)             \
+       $(XtAppCreateShell_shadows)             \
+       $(XtAppError_shadows)                   \
+       $(XtAppErrorMsg_shadows)                \
+       $(XtAppGetErrorDatabase_shadows)        \
+       $(XtAppGetSelectionTimeout_shadows)     \
+       $(XtAppNextEvent_shadows)               \
+       $(XtNextEvent_shadows)                  \
+       $(XtCallCallbacks_shadows)              \
+       $(XtClass_shadows)                      \
+       $(XtConfigureWidget_shadows)            \
+       $(XtConvert_shadows)                    \
+       $(XtConvertAndStore_shadows)            \
+       $(XtCreateApplicationContext_shadows)   \
+       $(XtCreatePopupShell_shadows)           \
+       $(XtCreateWidget_shadows)               \
+       $(XtDisplay_shadows)                    \
+       $(XtDisplayInitialize_shadows)          \
+       $(XtGetGC_shadows)                      \
+       $(XtGetResourceList_shadows)            \
+       $(XtGetSelectionValue_shadows)          \
+       $(XtGetSubresources_shadows)            \
+       $(XtGetApplicationResources_shadows)    \
+       $(XtMakeGeometryRequest_shadows)        \
+       $(XtMalloc_shadows)                     \
+       $(XtManageChildren_shadows)             \
+       $(XtMapWidget_shadows)                  \
+       $(XtNameToWidget_shadows)               \
+       $(XtOffset_shadows)                     \
+       $(XtOwnSelection_shadows)               \
+       $(XtParseAcceleratorTable_shadows)      \
+       $(XtParseTranslationTable_shadows)      \
+       $(XtPopdown_shadows)                    \
+       $(XtPopup_shadows)                      \
+       $(XtRealizeWidget_shadows)              \
+       $(XtSetArg_shadows)                     \
+       $(XtSetKeyTranslator_shadows)           \
+       $(XtSetSensitive_shadows)               \
+       $(XtSetValues_shadows)                  \
+       $(XtGetKeysymTable_shadows)             \
+       $(XtAppSetTypeConverter_shadows)        \
+       $(XtAppAddActionHook_shadows)           \
+       $(XtSetMultiClickTime_shadows)          \
+       $(XtInsertEventTypeHandler_shadows)     \
+       $(XtLastEventProcessed_shadows)         \
+       $(XtAppAddSignal_shadows)               \
+       $(XtAddInput_shadows)                   \
+       $(XtAppAddBlockHook_shadows)            \
+       $(XtAppInitialize_shadows)              \
+       $(XtSessionGetToken_shadows)            \
+       $(XtErrorMsg_shadows)                   \
+       $(XtError_shadows)                      \
+       $(XtGetErrorDatabase_shadows)           \
+       $(XtGetSelectionValueIncremental_shadows) \
+       $(XtGetSelectionTimeout_shadows)        \
+       $(XtCreateSelectionRequest_shadows)     \
+       $(XtReservePropertyAtom_shadows)        \
+       $(XtGrabKey_shadows)                    \
+       $(XtRegisterDrawable_shadows)           \
+       $(XtAppSetExitFlag_shadows)             \
+       $(XtAppLock_shadows)                    \
+       $(XtProcessLock_shadows)                \
+       $(XtOpenApplication_shadows)
+
+XtAddCallback_shadows =                                \
+       XtAddCallbacks                          \
+       XtRemoveCallback                        \
+       XtRemoveCallbacks                       \
+       XtRemoveAllCallbacks
+
+XtAddEventHandler_shadows =                    \
+       XtAddRawEventHandler                    \
+       XtRemoveEventHandler                    \
+       XtRemoveRawEventHandler                 \
+       XtInsertEventHandler                    \
+       XtInsertRawEventHandler
+
+XtAddGrab_shadows =                            \
+       XtRemoveGrab
+
+XtAppAddConverter_shadows =                    \
+       XtAddConverter
+
+XtAppAddInput_shadows =                                \
+       XtRemoveInput
+
+XtAppAddTimeOut_shadows =                      \
+       XtRemoveTimeOut
+
+XtAppAddWorkProc_shadows =                     \
+       XtRemoveWorkProc
+
+XtAppCreateShell_shadows =                     \
+       XtVaAppCreateShell
+
+XtAppError_shadows =                           \
+       XtAppSetErrorHandler                    \
+       XtAppSetWarningHandler                  \
+       XtAppWarning
+
+XtAppErrorMsg_shadows =                                \
+       XtAppSetErrorMsgHandler                 \
+       XtAppSetWarningMsgHandler               \
+       XtAppWarningMsg
+
+XtAppGetErrorDatabase_shadows =                        \
+       XtAppGetErrorDatabaseText
+
+XtAppGetSelectionTimeout_shadows =             \
+       XtAppSetSelectionTimeout
+
+XtAppNextEvent_shadows =                       \
+       XtAppPending                            \
+       XtAppPeekEvent                          \
+       XtAppProcessEvent                       \
+       XtDispatchEvent                         \
+       XtAppMainLoop
+
+XtNextEvent_shadows =                          \
+       XtPending                               \
+       XtPeekEvent                             \
+       XtProcessEvent                          \
+       XtMainLoop
+
+XtCallCallbacks_shadows =                      \
+       XtCallCallbackList                      \
+       XtHasCallbacks
+
+XtClass_shadows =                              \
+       XtSuperclass                            \
+       XtIsSubclass                            \
+       XtCheckSubclass                         \
+       XtIsObject                              \
+       XtIsRectObj                             \
+       XtIsWidget                              \
+       XtIsComposite                           \
+       XtIsConstraint                          \
+       XtIsShell                               \
+       XtIsOverrideShell                       \
+       XtIsWMShell                             \
+       XtIsVendorShell                         \
+       XtIsTransientShell                      \
+       XtIsTopLevelShell                       \
+       XtIsApplicationShell                    \
+       XtIsSessionShell
+
+XtConfigureWidget_shadows =                    \
+       XtMoveWidget                            \
+       XtResizeWidget
+
+XtConvert_shadows =                            \
+       XtDirectConvert
+
+XtConvertAndStore_shadows =                    \
+       XtCallConverter
+
+XtCreateApplicationContext_shadows =           \
+       XtDestroyApplicationContext             \
+       XtWidgetToApplicationContext            \
+       XtToolkitInitialize
+
+XtCreatePopupShell_shadows =                   \
+       XtVaCreatePopupShell
+
+XtCreateWidget_shadows =                       \
+       XtVaCreateWidget                        \
+       XtCreateManagedWidget                   \
+       XtVaCreateManagedWidget                 \
+       XtDestroyWidget
+
+XtDisplay_shadows =                            \
+       XtDisplayOfObject                       \
+       XtScreen                                \
+       XtScreenOfObject                        \
+       XtWindow                                \
+       XtWindowOfObject
+
+XtDisplayInitialize_shadows =                  \
+       XtOpenDisplay                           \
+       XtCloseDisplay                          \
+       XtDatabase                              \
+       XtScreenDatabase
+
+XtGetGC_shadows =                              \
+       XtReleaseGC
+
+XtGetResourceList_shadows =                    \
+       XtGetConstraintResourceList
+
+XtGetSelectionValue_shadows =                  \
+       XtGetSelectionValues
+
+XtGetSubresources_shadows =                    \
+       XtVaGetSubresources
+
+XtGetApplicationResources_shadows =            \
+       XtVaGetApplicationResources
+
+XtMakeGeometryRequest_shadows =                        \
+       XtMakeResizeRequest
+
+XtMalloc_shadows =                             \
+       XtCalloc                                \
+       XtRealloc                               \
+       XtFree                                  \
+       XtNew                                   \
+       XtNewString                             \
+       XtAsprintf
+
+XtManageChildren_shadows =                     \
+       XtManageChild                           \
+       XtUnmanageChildren                      \
+       XtUnmanageChild                         \
+       XtIsManaged                             \
+       XtChangeManagedSet
+
+XtMapWidget_shadows =                          \
+       XtSetMappedWhenManaged                  \
+       XtUnmapWidget
+
+XtNameToWidget_shadows =                       \
+       XtWindowToWidget
+
+XtOffset_shadows =                             \
+       XtOffsetOf                              \
+       XtNumber
+
+XtOwnSelection_shadows =                       \
+       XtOwnSelectionIncremental               \
+       XtDisownSelection
+
+XtParseAcceleratorTable_shadows =              \
+       XtInstallAccelerators                   \
+       XtInstallAllAccelerators
+
+XtParseTranslationTable_shadows =              \
+       XtAugmentTranslations                   \
+       XtOverrideTranslations                  \
+       XtUninstallTranslations
+
+XtPopdown_shadows =                            \
+       XtCallbackPopdown                       \
+       MenuPopdown
+
+XtPopup_shadows =                              \
+       XtPopupSpringLoaded                     \
+       XtCallbackNone                          \
+       XtCallbackNonexclusive                  \
+       XtCallbackExclusive                     \
+       MenuPopup
+
+XtRealizeWidget_shadows =                      \
+       XtIsRealized                            \
+       XtUnrealizeWidget
+
+XtSetArg_shadows =                             \
+       XtMergeArgLists
+
+XtSetKeyTranslator_shadows =                   \
+       XtTranslateKeycode                      \
+       XtRegisterCaseConverter                 \
+       XtConvertCase
+
+XtSetSensitive_shadows =                       \
+       XtIsSensitive
+
+XtSetValues_shadows =                          \
+       XtVaSetValues                           \
+       XtSetSubvalues                          \
+       XtGetValues                             \
+       XtVaGetValues                           \
+       XtGetSubvalues                          \
+       XtVaGetSubvalues                        \
+       XtVaSetSubvalues
+
+XtGetKeysymTable_shadows =                     \
+       XtKeysymToKeycodeList
+
+XtAppSetTypeConverter_shadows =                        \
+       XtSetTypeConverter
+
+XtAppAddActionHook_shadows =                   \
+       XtRemoveActionHook
+
+XtSetMultiClickTime_shadows =                  \
+       XtGetMultiClickTime
+
+XtInsertEventTypeHandler_shadows =             \
+       XtRemoveEventTypeHandler                \
+       XtRegisterExtensionSelector             \
+       XtSetEventDispatcher                    \
+       XtDispatchEventToWidget
+
+XtLastEventProcessed_shadows =                 \
+       XtLastTimestampProcessed
+
+XtAppAddSignal_shadows =                       \
+       XtNoticeSignal                          \
+       XtRemoveSignal
+
+XtAddInput_shadows =                           \
+       XtAddTimeOut                            \
+       XtAddWorkProc
+
+XtAppAddBlockHook_shadows =                    \
+       XtRemoveBlockHook
+
+XtAppInitialize_shadows =                      \
+       XtVaAppInitialize
+
+XtSessionGetToken_shadows =                    \
+       XtSessionReturnToken
+
+XtErrorMsg_shadows =                           \
+       XtSetErrorMsgHandler                    \
+       XtSetWarningMsgHandler                  \
+       XtWarningMsg
+
+XtError_shadows =                              \
+       XtSetErrorHandler                       \
+       XtSetWarningHandler                     \
+       XtWarning
+
+XtGetErrorDatabase_shadows =                   \
+       XtGetErrorDatabaseText
+
+XtGetSelectionValueIncremental_shadows =       \
+       XtGetSelectionValuesIncremental
+
+XtGetSelectionTimeout_shadows =                        \
+       XtSetSelectionTimeout
+
+XtCreateSelectionRequest_shadows =             \
+       XtSendSelectionRequest                  \
+       XtCancelSelectionRequest
+
+XtReservePropertyAtom_shadows =                        \
+       XtReleasePropertyAtom
+
+XtGrabKey_shadows =                            \
+       XtUngrabKey                             \
+       XtGrabKeyboard                          \
+       XtUngrabKeyboard                        \
+       XtGrabButton                            \
+       XtUngrabButton                          \
+       XtGrabPointer                           \
+       XtUngrabPointer
+
+XtRegisterDrawable_shadows =                   \
+       XtUnregisterDrawable
+
+XtAppSetExitFlag_shadows =                     \
+       XtAppGetExitFlag
+
+XtAppLock_shadows =                            \
+       XtAppUnlock
+
+XtProcessLock_shadows =                                \
+       XtProcessUnlock
+
+XtOpenApplication_shadows =                    \
+       XtVaOpenApplication
+
+# String replacements in MAN_SUBSTS now come from xorg-macros.m4 via configure
+.man.$(LIB_MAN_SUFFIX):
+       $(AM_V_GEN)$(SED) $(MAN_SUBSTS) < $< > $@
diff --git a/man/MenuPopdown.man b/man/MenuPopdown.man
new file mode 100644 (file)
index 0000000..e40b612
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtPopdown.__libmansuffix__
diff --git a/man/MenuPopup.man b/man/MenuPopup.man
new file mode 100644 (file)
index 0000000..0267c01
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtPopup.__libmansuffix__
diff --git a/man/XtAddActions.man b/man/XtAddActions.man
new file mode 100644 (file)
index 0000000..8fd60d7
--- /dev/null
@@ -0,0 +1,146 @@
+.\" Copyright (c) 1993, 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 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 dealing in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtApp-Add-Actions wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtAddActions __libmansuffix__ __xorgversion__ "XT COMPATIBILITY FUNCTIONS"
+.SH NAME
+XtAddActions \- register an action table
+.SH SYNTAX
+.HP
+void XtAddActions(XtActionList \fIactions\fP, Cardinal \fInum_actions\fP);
+.SH ARGUMENTS
+.IP \fIactions\fP 1i
+Specifies the action table to register.
+.IP \fInum_args\fP 1i
+Specifies the number of entries in this action table.
+.SH DESCRIPTION
+.ZN XtAddActions
+has been replaced by
+.ZN XtAppAddActions .
+.SH "SEE ALSO"
+XtAppAddActions(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtAddCallback.man b/man/XtAddCallback.man
new file mode 100644 (file)
index 0000000..817e639
--- /dev/null
@@ -0,0 +1,189 @@
+.\" Copyright (c) 1993, 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 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 dealing in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtAdd-Callback XtAdd-Callbacks XtRemove-Callback XtRemove-Callbacks XtRemove-All-Callbacks wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtAddCallback __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtAddCallback, XtAddCallbacks, XtRemoveCallback, XtRemoveCallbacks, XtRemoveAllCallbacks \- add and remove callback procedures
+.SH SYNTAX
+.HP
+void XtAddCallback(Widget \fIw\fP, String \fIcallback_name\fP, XtCallbackProc
+\fIcallback\fP, XtPointer \fIclient_data\fP);
+.HP
+void XtAddCallbacks(Widget \fIw\fP, String \fIcallback_name\fP, XtCallbackList
+\fIcallbacks\fP);
+.HP
+void XtRemoveCallback(Widget \fIw\fP, String \fIcallback_name\fP,
+XtCallbackProc \fIcallback\fP, XtPointer \fIclient_data\fP);
+.HP
+void XtRemoveCallbacks(Widget \fIw\fP, String \fIcallback_name\fP,
+XtCallbackList \fIcallbacks\fP);
+.HP
+void XtRemoveAllCallbacks(Widget \fIw\fP, String \fIcallback_name\fP,
+.SH ARGUMENTS
+.IP \fIcallback\fP 1i
+Specifies the callback procedure\*(Cb.
+.IP \fIcallbacks\fP 1i
+Specifies the null-terminated list of callback procedures and corresponding
+client data.
+.ds Cn \ to which the procedure is to be appended or deleted
+.IP \fIcallback_name\fP 1i
+Specifies the callback list\*(Cn.
+.ds Cd it is invoked by XtCallbacks or NULL, \
+or the client data to match on the registered callback procedures
+.IP \fIclient_data\fP 1i
+Specifies the argument that is to be passed to the specified procedure
+when \*(Cd.
+.IP \fIw\fP 1i
+Specifies the widget.
+.SH DESCRIPTION
+The
+.ZN XtAddCallback
+function adds the specified callback procedure to the specified widget's
+callback list.
+.LP
+The
+.ZN XtAddCallbacks
+add the specified list of callbacks to the specified widget's callback list.
+.LP
+The
+.ZN XtRemoveCallback
+function removes a callback only if both the procedure and the client
+data match.
+.LP
+The
+.ZN XtRemoveCallbacks
+function removes the specified callback procedures from the specified
+widget's callback list.
+.LP
+The
+.ZN XtRemoveAllCallbacks
+function removes all the callback procedures from the specified
+widget's callback list.
+.SH "SEE ALSO"
+XtCallCallbacks(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtAddCallbacks.man b/man/XtAddCallbacks.man
new file mode 100644 (file)
index 0000000..0dbea45
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAddCallback.__libmansuffix__
diff --git a/man/XtAddConverter.man b/man/XtAddConverter.man
new file mode 100644 (file)
index 0000000..4fe07cf
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAppAddConverter.__libmansuffix__
diff --git a/man/XtAddEventHandler.man b/man/XtAddEventHandler.man
new file mode 100644 (file)
index 0000000..188b054
--- /dev/null
@@ -0,0 +1,238 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtAdd-Event-Handler XtAdd-Raw-Event-Handler XtRemove-Event-Handler XtRemove-Raw-Event-Handler XtInsert-Event-Handler XtInsert-Raw-Event-Handler wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtAddEventHandler __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtAddEventHandler, XtAddRawEventHandler, XtRemoveEventHandler, XtRemoveRawEventHandler, XtInsertEventHandler, XtInsertRawEventHandler \- add and remove event handlers
+.SH SYNTAX
+.HP
+void XtAddEventHandler(Widget \fIw\fP, EventMask \fIevent_mask\fP, Boolean
+\fInonmaskable\fP, XtEventHandler \fIproc\fP, XtPointer \fIclient_data\fP);
+.HP
+void XtAddRawEventHandler(Widget \fIw\fP, EventMask \fIevent_mask\fP, Boolean
+\fInonmaskable\fP, XtEventHandler \fIproc\fP, XtPointer \fIclient_data\fP);
+.HP
+void XtRemoveEventHandler(Widget \fIw\fP, EventMask \fIevent_mask\fP, Boolean
+\fInonmaskable\fP, XtEventHandler \fIproc\fP, XtPointer \fIclient_data\fP);
+.HP
+void XtRemoveRawEventHandler(Widget \fIw\fP, EventMask \fIevent_mask\fP,
+Boolean \fInonmaskable\fP, XtEventHandler \fIproc\fP, XtPointer
+\fIclient_data\fP);
+.HP
+void XtInsertEventHandler(Widget \fIw\fP, EventMask \fIevent_mask\fP, Boolean
+\fInonmaskable\fP, XtEventHandler \fIproc\fP, XtPointer \fIclient_data\fP,
+XtListPosition \fIposition\fP);
+.HP
+void XtInsertRawEventHandler(Widget \fIw\fP, EventMask \fIevent_mask\fP,
+Boolean \fInonmaskable\fP, XtEventHandler \fIproc\fP, XtPointer
+\fIclient_data\fP, XtListPosition \fIposition\fP);
+.HP
+typedef enum { XtListHead, XtListTail } XtListPosition;
+.SH ARGUMENTS
+.IP \fIclient_data\fP 1i
+Specifies additional data to be passed to the client's event handler.
+.ds Em to call or unregister this procedure
+.IP \fIevent_mask\fP 1i
+Specifies the event mask for which \*(Em.
+.ds Nm called or removed
+.IP \fInonmaskable\fP 1i
+Specifies a Boolean value that indicates whether this procedure should be
+\*(Nm on the nonmaskable events
+.Pn ( GraphicsExpose ,
+.ZN NoExpose ,
+.ZN SelectionClear ,
+.ZN SelectionRequest ,
+.ZN SelectionNotify ,
+.ZN ClientMessage ,
+and
+.ZN MappingNotify ).
+.ds Pr \ to be added or removed
+.IP \fIproc\fP 1i
+Specifies the procedure that is\*(Pr.
+.ds Wi for which this event handler is being registered
+.IP \fIw\fP 1i
+Specifies the widget \*(Wi.
+.IP \fIposition\fP 1i
+Specifies when the event handler is to be called relative to other
+previously registered handlers.
+.SH DESCRIPTION
+The
+.ZN XtAddEventHandler
+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.
+If the procedure is already registered with the same client_data,
+the specified mask is ORed into the existing mask.
+If the widget is realized,
+.ZN XtAddEventHandler
+calls
+.ZN XSelectInput ,
+if necessary.
+.LP
+The
+.ZN XtAddRawEventHandler
+function is similar to
+.ZN XtAddEventHandler
+except that it does not affect the widget's mask and never causes an
+.ZN XSelectInput
+for its events.
+Note that the widget might already have those mask bits set
+because of other nonraw event handlers registered on it.
+.LP
+The
+.ZN XtRemoveRawEventHandler
+function stops the specified procedure from receiving the specified events.
+Because the procedure is a raw event handler,
+this does not affect the widget's mask and never causes a call on
+.ZN XSelectInput .
+.LP
+.ZN XtInsertEventHandler
+is identical to
+.ZN XtAddEventHandler
+with the additional \fIposition\fP argument. if \fIposition\fP is
+.ZN XtListHead ,
+the event handler is registered to that it will be called before
+any event handlers that were previously registered for the same widget.
+If \fIposition\fP is
+.ZN XtListTail ,
+the event handler is registered to be called after any previously
+registered event handlers. If the procedure is already registered with
+the same \fIclient_data\fP value, the specified mask augments the
+existing mask and the procedure is repositioned in the list.
+.LP
+.ZN XtInsertRawEventHandler
+is similar to
+.ZN XtInsertEventHandler
+except that it does not modify the widget's event mask and never causes an
+.ZN XSelectInput
+for the specified events. If the procedure is already registered with the
+same \fIclient_data\fP value, the specified mask augments the existing
+mask and the procedure is repositioned in the list.
+.SH "SEE ALSO"
+XtAppNextEvent(__libmansuffix__),
+XtBuildEventMask(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtAddExposureToRegion.man b/man/XtAddExposureToRegion.man
new file mode 100644 (file)
index 0000000..3926b0d
--- /dev/null
@@ -0,0 +1,162 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtAdd-Exposure-To-Region wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtAddExposureToRegion __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtAddExposureToRegion \- merge exposure events into a region
+.SH SYNTAX
+.HP
+void XtAddExposureToRegion(XEvent *\fIevent\fP, Region \fIregion\fP);
+.SH ARGUMENTS
+.IP \fIevent\fP 1i
+Specifies a pointer to the
+.ZN Expose
+or
+.ZN GraphicsExpose
+event.
+.IP \fIregion\fP 1i
+Specifies the region object (as defined in
+.Pn < X11/Xutil.h >).
+.SH DESCRIPTION
+The
+.ZN XtAddExposureToRegion
+function computes the union of the rectangle defined by the exposure
+event and the specified region.
+Then, it stores the results back in region.
+If the event argument is not an
+.ZN Expose
+or
+.ZN GraphicsExpose
+event,
+.ZN XtAddExposureToRegion
+returns without an error and without modifying region.
+.LP
+This function is used by the exposure compression mechanism
+(see Section 7.9.3).
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtAddGrab.man b/man/XtAddGrab.man
new file mode 100644 (file)
index 0000000..3751708
--- /dev/null
@@ -0,0 +1,197 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtAdd-Grab wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtAddGrab __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtAddGrab, XtRemoveGrab \- redirect user input to a modal widget
+.SH SYNTAX
+.HP
+void XtAddGrab(Widget \fIw\fP, Boolean \fIexclusive\fP, Boolean
+\fIspring_loaded\fP);
+.HP
+void XtRemoveGrab(Widget \fIw\fP);
+.SH ARGUMENTS
+.IP \fIexclusive\fP 1i
+Specifies whether user events should be dispatched exclusively to this widget
+or also to previous widgets in the cascade.
+.IP \fIspring_loaded\fP 1i
+Specifies whether this widget was popped up because the user pressed
+a pointer button.
+.ds Wi to add to or remove from the modal cascade
+.IP \fIw\fP 1i
+Specifies the widget \*(Wi.
+.SH DESCRIPTION
+The
+.ZN XtAddGrab
+function appends the widget (and associated parameters) to the modal cascade
+and checks that exclusive is
+.ZN True
+if spring_loaded is
+.ZN True .
+If these are not
+.ZN True ,
+.ZN XtAddGrab
+generates an error.
+.LP
+The modal cascade is used by
+.ZN XtDispatchEvent
+when it tries to dispatch a user event.
+When at least one modal widget is in the widget cascade,
+.ZN XtDispatchEvent
+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 exclusive parameter
+.ZN True .
+.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 exclusive
+.ZN False .
+Modal dialog boxes that need to restrict user input to the most deeply nested
+dialog box add a subdialog widget to the cascade with exclusive
+.ZN True .
+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.
+.LP
+Regardless of where on the screen they occur,
+remap events are always delivered to the most recent widget in the active
+subset of the cascade that has spring_loaded
+.ZN True ,
+if any such widget exists.
+.LP
+The
+.ZN XtRemoveGrab
+function removes widgets from the modal cascade starting
+at the most recent widget up to and including the specified widget.
+It issues an error if the specified widget is not on the modal cascade.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtAddInput.man b/man/XtAddInput.man
new file mode 100644 (file)
index 0000000..aca3e3f
--- /dev/null
@@ -0,0 +1,168 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtAdd-Input XtAdd-TimeOut XtAddWorkProc wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtAddInput __libmansuffix__ __xorgversion__ "XT COMPATIBILITY FUNCTIONS"
+.SH NAME
+XtAddInput, XtAddTimeOut, XtAddWorkProc \- register input, timeout, and workprocs
+.SH SYNTAX
+.HP
+XtInputId XtAddInput(int \fIsource\fP, XtPointer \fIcondition\fP,
+XtInputCallbackProc \fIproc\fP, XtPointer \fIclient_data\fP);
+.HP
+XtIntervalId XtAddTimeOut(unsigned long \fIinterval\fP, XtInputCallbackProc
+\fIproc\fP, XtPointer \fIclient_data\fP);
+.HP
+XtWorkProcId XtAddWorkProc(XtWorkProc \fIproc\fP, XtPointer
+\fIclient_data\fP);
+.LP
+.SH ARGUMENTS
+.IP \fIclient_data\fP 1i
+Specifies the argument that is to be passed to the specified procedure
+when input is available
+.IP \fIcondition\fP 1i
+Specifies the mask that indicates a read, write, or exception condition
+or some operating system dependent condition.
+.IP \fIproc\fP 1i
+Specifies the procedure that is to be called when input is available.
+.IP \fIsource\fP 1i
+Specifies the source file descriptor on a UNIX-based system
+or other operating system dependent device specification.
+.SH DESCRIPTION
+.ZN XtAddInput
+has been replaced by
+.ZN XtAppAddInput.
+.LP
+.ZN XtAddTimeOut
+has been replaced by
+.ZN XtAppAddTimeOut.
+.LP
+.ZN XtAddWorkProc
+has been replaced by
+.ZN XtAppAddWorkProc .
+.SH "SEE ALSO"
+XtAppAddInput(__libmansuffix__), XtAppAddTimeOut(__libmansuffix__), XtAppAddWorkProc(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtAddRawEventHandler.man b/man/XtAddRawEventHandler.man
new file mode 100644 (file)
index 0000000..ab49e9e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAddEventHandler.__libmansuffix__
diff --git a/man/XtAddTimeOut.man b/man/XtAddTimeOut.man
new file mode 100644 (file)
index 0000000..bd58584
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAddInput.__libmansuffix__
diff --git a/man/XtAddWorkProc.man b/man/XtAddWorkProc.man
new file mode 100644 (file)
index 0000000..bd58584
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAddInput.__libmansuffix__
diff --git a/man/XtAllocateGC.man b/man/XtAllocateGC.man
new file mode 100644 (file)
index 0000000..da43131
--- /dev/null
@@ -0,0 +1,187 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtAllocate-GC wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtAllocateGC __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtAllocateGC \- obtain a sharable GC with modifiable fields
+.SH SYNTAX
+.HP
+GC XtAllocateGC(Widget \fIw\fP, Cardinal \fIdepth\fP, XtGCMask
+\fIvalue_mask\fP, XGCValues *\fIvalues\fP, XtGCMask \fIdynamic_mask\fP,
+XtGCMask \fIunused_mask\fP);
+.SH ARGUMENTS
+.IP \fIvalues\fP 1i
+Specifies the actual values for this GC.
+.ds Vm fields of the values are specified
+.IP \fIvalue_mask\fP 1i
+Specifies which \*(Vm.
+.IP \fIw\fP 1i
+Specifies the widget.
+.IP \fIdepth\fP 1i
+Specifies the depth for which the returned GC is valid, or 0.
+.IP  \fIdynamic_mask\fP 1i
+Specifies the fields of the GC that will be modified by the caller.
+.IP  \fIunused_mask\fP 1i
+Specifies the fields of the GC that will not be needed by the caller.
+.SH DESCRIPTION
+The
+.ZN XtAllocateGC
+function returns a sharable GC that may be modified by the client.
+The \fIscreen\fP field of the specified widget or of the nearest
+widget ancestor of the specified object and the specified \fIdepth\fP
+argument supply the root and drawable depths for which the GC is to
+be valid. If \fIdepth\fP is zero the depth is taken from the \fIdepth\fP
+field of the specified widget or of the nearest widget ancestor of the
+specified object.
+.LP
+The \fIvalue_mask\fP argument specifies the fields of the GC that will
+be initialized with the respective members of the \fIvalues\fP structure.
+The \fIdynamic_mask\fP 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
+\fIunused_mask\fP 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 \fIunused_mask\fP. The caller may
+assume that at all times all fields not specified in either
+\fIdynamic_mask\fP or \fIunused_mask\fP have their default value if
+not specified in \fIvalue_mask\fP or the value specified by \fIvalues\fP.
+If a field is specified in both \fIvalue_mask\fP and \fPdynamic_mask\fP,
+the effect is as if it were specified only in \fIdynamic_mask\fP and
+then immediately set to the value in \fIvalues\fP. If a field is set
+in \fIunused_mask\fP and also in either \fIvalue_mask\fP or
+\fIdynamic_mask\fP, the specification in \fIunused_mask\fP is ignored.
+.LP
+.ZN XtAllocateGC
+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.
+.ZN XtAllocateGC
+may modify and return an existing GC if it was allocated with a nonzero
+\fIunused_mask\fP.
+.SH "SEE ALSO"
+.ZN XtGetGC
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtAppAddActionHook.man b/man/XtAppAddActionHook.man
new file mode 100644 (file)
index 0000000..a9a52bc
--- /dev/null
@@ -0,0 +1,163 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtApp-Add-Action-Hook XtRemove-Action-Hook wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtAppAddActionHook __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtAppAddActionHook, XtRemoveActionHook \- register an action hook procedure
+.SH SYNTAX
+.HP
+XtActionHookId XtAppAddActionHook(XtAppContext \fIapp_context\fP,
+XtActionHookProc \fIproc\fP, XtPointer \fIclient_data\fP);
+.HP
+void XtRemoveActionHook(XtActionHookId \fIid\fP);
+.SH ARGUMENTS
+.IP \fIapp_context\fP 1i
+Specifies the application context.
+.IP \fIproc\fP 1i
+Specifies the action hook procedure.
+.IP \fInum_args\fP 1i
+Specifies the application-specific data to be passed to the action hook.
+.SH DESCRIPTION
+.ZN XtAppAddActionHook
+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
+.ZN XtCallActionProc ,
+the action hohok procedures will be called in reverse order of registration
+jut prior to invoking the action routine.
+.LP
+Action hook procedures are removed automatically and the
+.ZN XtActionHookId
+s destroyed when the application context in which they were added is
+destroyed.
+.LP
+.ZN XtRemoveActionHook
+removes the specified action hook procedure from the list in which it
+was registered.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtAppAddActions.man b/man/XtAppAddActions.man
new file mode 100644 (file)
index 0000000..4022a3c
--- /dev/null
@@ -0,0 +1,150 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtApp-Add-Actions wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtAppAddActions __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtAppAddActions \- register an action table
+.SH SYNTAX
+.HP
+void XtAppAddActions(XtAppContext \fIapp_context\fP, XtActionList
+\fIactions\fP, Cardinal \fInum_actions\fP);
+.SH ARGUMENTS
+.IP \fIapp_context\fP 1i
+Specifies the application context.
+.IP \fIactions\fP 1i
+Specifies the action table to register.
+.IP \fInum_args\fP 1i
+Specifies the number of entries in this action table.
+.SH DESCRIPTION
+The
+.ZN XtAppAddActions
+function adds the specified action table and registers it with the
+translation manager.
+.SH "SEE ALSO"
+XtParseTranslationTable(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtAppAddBlockHook.man b/man/XtAppAddBlockHook.man
new file mode 100644 (file)
index 0000000..581c76f
--- /dev/null
@@ -0,0 +1,159 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtApp-Add-Block-Hook XtRemove-Block-Hook wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtAppAddBlockHook __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtAppAddBlockHook, XtRemoveBlockHook \- register a block hook procedure
+.SH SYNTAX
+.HP
+XtBlockHookId XtAppAddBlockHook(XtAppContext \fIapp_context\fP,
+XtBlockHookProc \fIproc\fP, XtPointer \fIclient_data\fP);
+.HP
+void XtRemoveBlockHook(XtBlockHookId \fIid\fP);
+.SH ARGUMENTS
+.IP \fIapp_context\fP 1i
+Specifies the application context.
+.IP \fIproc\fP 1i
+Specifies the block hook procedure.
+.IP \fInum_args\fP 1i
+Specifies the application-specific data to be passed to the block hook.
+.SH DESCRIPTION
+.ZN XtAppAddBlockHook
+registers the specified procedure and returns an identifier for it.
+The hook is called at any time in the future when the Intrinsics are
+about to block pending some input.
+.LP
+Block hook procedures are removed automatically and the
+.ZN XtBlockHookId
+is destroyed when the application context in which they were added is
+destroyed.
+.LP
+.ZN XtRemoveBlockHook
+removes the specified block hook procedure from the list in which it
+was registered.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtAppAddConverter.man b/man/XtAppAddConverter.man
new file mode 100644 (file)
index 0000000..4f56e09
--- /dev/null
@@ -0,0 +1,173 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtApp-Add-Converter XtAdd-Converter wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtAppAddConverter __libmansuffix__ __xorgversion__ "XT COMPATIBILITY FUNCTIONS"
+.SH NAME
+XtAppAddConverter, XtAddConverter \- register resource converter
+.SH SYNTAX
+.HP
+void XtAppAddConverter(XtAppContext \fIapp_context\fP, String \fIfrom_type\fP,
+String \fIto_type\fP, XtConverter \fIconverter\fP, XtConvertArgList
+\fIconvert_args\fP, Cardinal \fInum_args\fP);
+.HP
+void XtAddConverter(String \fIfrom_type\fP, String \fIto_type\fP, XtConverter
+\fIconverter\fP, XtConvertArgList \fIconvert_args\fP, Cardinal
+\fInum_args\fP);
+.SH ARGUMENTS
+.IP \fIapp_context\fP 1i
+Specifies the application context.
+.IP \fIconverter\fP 1i
+Specifies the type converter procedure.
+.IP \fIconvert_args\fP 1i
+Specifies how to compute the additional arguments to the converter or NULL.
+.IP \fIfrom_type\fP 1i
+Specifies the source type.
+.IP \fInum_args\fP 1i
+Specifies the number of additional arguments to the converter or zero.
+.IP \fIto_type\fP 1i
+Specifies the destination type.
+.SH DESCRIPTION
+.ZN XtAppAddConverter
+is equivalent in function to
+.ZN XtAppSetTypeConverter
+with \fIcache_type\fP equal to
+.ZN XtCacheAll
+for old-format type converters. It has been superseded by
+.ZN XtAppSetTypeConverter .
+.LP
+.ZN XtAddConverter
+is equivalent in function to
+.ZN XtSetTypeConverter
+with \fIcache_type\fP equal to
+.ZN XtCacheAll
+for old-format type converters. It has been superseded by
+.ZN XtSetTypeConverter .
+.SH "SEE ALSO"
+XtConvert(__libmansuffix__),
+XtStringConversionWarning(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtAppAddInput.man b/man/XtAppAddInput.man
new file mode 100644 (file)
index 0000000..2c0bf9d
--- /dev/null
@@ -0,0 +1,202 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtApp-Add-Input wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtAppAddInput __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtAppAddInput, XtRemoveInput \- register and remove an input source
+.SH SYNTAX
+.HP
+XtInputId XtAppAddInput(XtAppContext \fIapp_context\fP, int \fIsource\fP,
+XtPointer \fIcondition\fP, XtInputCallbackProc \fIproc\fP, XtPointer
+\fIclient_data\fP);
+.HP
+void XtRemoveInput(XtInputId \fIid\fP);
+.SH ARGUMENTS
+.ds Co that identifies the application
+.IP \fIapp_context\fP 1i
+Specifies the application context \*(Co.
+.ds Cd input is available
+.IP \fIclient_data\fP 1i
+Specifies the argument that is to be passed to the specified procedure
+when \*(Cd.
+.IP \fIcondition\fP 1i
+Specifies the mask that indicates a read, write, or exception condition
+or some operating system dependent condition.
+.IP \fIid\fP 1i
+Specifies the ID returned from the corresponding
+.ZN XtAppAddInput
+call.
+.ds Pr \ to be called when input is available
+.IP \fIproc\fP 1i
+Specifies the procedure that is\*(Pr.
+.IP \fIsource\fP 1i
+Specifies the source file descriptor on a UNIX-based system
+or other operating system dependent device specification.
+.SH DESCRIPTION
+The
+.ZN XtAppAddInput
+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 file should be loosely interpreted to mean any sink
+or source of data.
+.ZN XtAppAddInput
+also specifies the conditions under which the source can generate events.
+When input is pending on this source,
+the callback procedure is called.
+.LP
+The legal values for the condition argument are operating-system dependent.
+On a UNIX-based system,
+the condition is some union of
+.ZN XtInputReadMask ,
+.ZN XtInputWriteMask ,
+and
+.ZN XtInputExceptMask .
+The
+.ZN XtRemoveInput
+function causes the \*(xI read routine to stop watching for input
+from the input source.
+.SH "SEE ALSO"
+XtAppAddTimeOut(__libmansuffix__),XtAppAddSignal(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
+.LP
+.SH "BUGS"
+In ANSI C it is necessary to cast the condition to an XtPointer, e.g.:
+.RS 4
+.br
+XtAppAddInput(app_context,
+.RS 4
+.br
+source,
+.br
+.B (XtPointer)
+(XtInputReadMask | XtInputWriteMask),
+.br
+proc,
+.br
+client_data);
+.RE
diff --git a/man/XtAppAddSignal.man b/man/XtAppAddSignal.man
new file mode 100644 (file)
index 0000000..8dc7fa1
--- /dev/null
@@ -0,0 +1,194 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtApp-Add-Signal wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtAppAddSignal __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtAppAddSignal, XtRemoveSignal, XtNoticeSignal \- register and remove a signal source
+.SH SYNTAX
+.HP
+XtSignalId XtAppAddSignal(XtAppContext \fIapp_context\fP, XtSignalCallbackProc
+\fIproc\fP, XtPointer \fIclient_data\fP);
+.HP
+void XtRemoveSignal(XtSignalId \fIid\fP);
+.HP
+void XtNoticeSignal(XtSignalId \fIid\fP);
+.SH ARGUMENTS
+.IP \fIapp_context\fP 1i
+Specifies the application context.
+.IP \fIclient_data\fP 1i
+Specifies the argument that is to be passed to the specified procedure
+when a signal has been raised.
+.IP \fIid\fP 1i
+Specifies the ID returned from the corresponding
+.ZN XtAppAddSignal
+call.
+.IP \fIproc\fP 1i
+Specifies the procedure that is to be called when the signal has been
+raised.
+.SH DESCRIPTION
+The
+.ZN XtAppAddSignal
+function initiates a mechanism for handling signals within the context
+of the Intrinsics. Prior to establishing an operating system dependent
+signal handler the application may call
+.ZN XtAppAddSignal
+and store the returned \fIid\fP in a place accessible to the signal
+handler.
+.LP
+Upon receipt of a signal from the operating system, the application may
+call
+.ZN XtNoticeSignal
+passing the \fIid\fP returned by the call to
+.ZN XtAppAddSignal .
+.LP
+.ZN XtNoticeSignal
+is the only Intrinsics function that can safely be called from a signal
+handler. If
+.ZN XtNoticeSignal
+is called multiple times before the Intrinsics are able to invoke the
+registered callback, the callback is only called once. Logically the
+Intrinsics maintain ``pending'' for each registered callback. This
+flag is initially
+.ZN False
+and is set to
+.ZN True
+by
+.ZN XtNoticeSignal ;
+the Intrinsics invoke the callback whenever the flag is
+.ZN True ,
+and the flag is set to
+.ZN False
+just before the callback is invoked.
+.LP
+The
+.ZN XtRemoveSignal
+function is called to remove the specified Intrinsics signal handler. The
+client should disable the source of the signal before calling
+.ZN XtRemoveSignal .
+.SH "SEE ALSO"
+XtAppAddTimeOut(__libmansuffix__),XtAppAddInput(__libmansuffix__),XtAppAddWorkProc(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtAppAddTimeOut.man b/man/XtAppAddTimeOut.man
new file mode 100644 (file)
index 0000000..f8a0c01
--- /dev/null
@@ -0,0 +1,166 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtApp-Add-Time-Out XtRemove-Time-Out wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtAppAddTimeOut __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtAppAddTimeOut, XtRemoveTimeOut \- register and remove timeouts
+.SH SYNTAX
+.HP
+XtIntervalId XtAppAddTimeOut(XtAppContext \fIapp_context\fP, unsigned long
+\fIinterval\fP, XtTimerCallbackProc \fIproc\fP, XtPointer \fIclient_data\fP);
+.HP
+void XtRemoveTimeOut(XtIntervalId \fItimer\fP);
+.SH ARGUMENTS
+.ds Co for which the timer is to be set
+.IP \fIapp_context\fP 1i
+Specifies the application context \*(Co.
+.IP \fIclient_data\fP 1i
+Specifies the argument that is to be passed to the specified procedure
+when \*(Cd.
+.IP \fIinterval\fP 1i
+Specifies the time interval in milliseconds.
+.ds Pr \ to be called when time expires
+.IP \fIproc\fP 1i
+Specifies the procedure that is\*(Pr.
+.IP \fItimer\fP 1i
+Specifies the ID for the timeout request to be destroyed.
+.SH DESCRIPTION
+The
+.ZN XtAppAddTimeOut
+function creates a timeout and returns an identifier for it.
+The timeout value is set to interval.
+The callback procedure is called when the time interval elapses,
+and then the timeout is removed.
+.LP
+The
+.ZN XtRemoveTimeOut
+function removes the timeout.
+Note that timeouts are automatically removed once they trigger.
+.SH "SEE ALSO"
+XtAppAddInput(__libmansuffix__),XtAppAddSignal(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtAppAddWorkProc.man b/man/XtAppAddWorkProc.man
new file mode 100644 (file)
index 0000000..351dc77
--- /dev/null
@@ -0,0 +1,161 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtApp-AddWork-Proc, XtRemove-Work-Proc wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtAppAddWorkProc __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtAppAddWorkProc, XtRemoveWorkProc \- Add and remove background processing procedures
+.SH SYNTAX
+.HP
+XtWorkProcId XtAppAddWorkProc(XtAppContext \fIapp_context\fP, XtWorkProc
+\fIproc\fP, XtPointer \fIclient_data\fP);
+.HP
+void XtRemoveWorkProc(XtWorkProcId \fIid\fP);
+.SH ARGUMENTS
+.ds Co that identifies the application
+.IP \fIapp_context\fP 1i
+Specifies the application context \*(Co.
+.ds Cd it is called
+.IP \fIclient_data\fP 1i
+Specifies the argument that is to be passed to the specified procedure
+when \*(Cd.
+.IP \fIproc\fP 1i
+Specifies the procedure that is\*(Pr.
+.IP \fIid\fP 1i
+Specifies which work procedure to remove.
+.SH DESCRIPTION
+The
+.ZN XtAppAddWorkProc
+function adds the specified work procedure for the application identified
+by app_context.
+.LP
+The
+.ZN XtRemoveWorkProc
+function explicitly removes the specified background work procedure.
+.SH "SEE ALSO"
+XtAppNextEvent(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtAppCreateShell.man b/man/XtAppCreateShell.man
new file mode 100644 (file)
index 0000000..3d09f88
--- /dev/null
@@ -0,0 +1,178 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtApp-Create-Shell XtVa-App-Create-Shell wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtAppCreateShell __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtAppCreateShell, XtVaAppCreateShell \- create top-level widget instance
+.SH SYNTAX
+.HP
+Widget XtAppCreateShell(String \fIapplication_name\fP, String
+\fIapplication_class\fP, WidgetClass \fIwidget_class\fP, Display
+*\fIdisplay\fP, ArgList \fIargs\fP, Cardinal \fInum_args\fP);
+.HP
+Widget XtVaAppCreateShell(String \fIapplication_name\fP, String
+\fIapplication_class\fP, WidgetClass \fIwidget_class\fP, Display
+*\fIdisplay\fP, ...\^);
+.SH ARGUMENTS
+.IP \fIapplication_name\fP 1i
+Specifies the name of the application instance.
+.IP \fIapplication_class\fP 1i
+Specifies the class name of this application\*(Ac.
+.ds Wc \ that the application top-level widget should be
+.IP \fIwidget_class\fP 1i
+Specifies the widget class\*(Wc.
+.ds Di \ from which to get the resources
+.IP \fIdisplay\fP 1i
+Specifies the display\*(Di.
+.IP \fIargs\fP 1i
+Specifies the argument list\*(Di.
+.IP \fInum_args\fP 1i
+Specifies the number of arguments in the argument list.
+.IP \fI...\fP 1i
+Specifies the variable argument list\*(Di.
+.SH DESCRIPTION
+The
+.ZN XtAppCreateShell
+function saves the specified application name and application class
+for qualifying all widget resource specifiers.
+The application name and application class are used as the left-most components
+in all widget resource names for this application.
+.ZN XtAppCreateShell
+should be used to create a new logical application within a program
+or to create a shell on another display.
+In the first case,
+it allows the specification of a new root in the resource hierarchy.
+In the second case,
+it uses the resource database associated with the other display.
+.LP
+Note that the widget returned by
+.ZN XtAppCreateShell
+has the \s-1WM_COMMAND\s+1
+property set for session managers (see Chapter 4).
+.SH "SEE ALSO"
+XtCreateWidget(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtAppError.man b/man/XtAppError.man
new file mode 100644 (file)
index 0000000..235037d
--- /dev/null
@@ -0,0 +1,177 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtApp-Error XtApp-Set-Error-Handler XtApp-Set-Warning-Handler XtApp-Warning wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtAppError __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtAppError, XtAppSetErrorHandler, XtAppSetWarningHandler, XtAppWarning \- low-level error handlers
+.SH SYNTAX
+.HP
+void XtAppError(XtAppContext \fIapp_context\fP, String \fImessage\fP);
+.HP
+void XtAppSetErrorHandler(XtAppContext \fIapp_context\fP, XtErrorHandler
+\fIhandler\fP);
+.HP
+void XtAppSetWarningHandler(XtAppContext \fIapp_context\fP, XtErrorHandler
+\fIhandler\fP);
+.HP
+void XtAppWarning(XtAppContext \fIapp_context\fP, String \fImessage\fP);
+.SH ARGUMENTS
+.IP \fIapp_context\fP 1i
+Specifies the application context.
+.IP \fImessage\fP 1i
+Specifies the nonfatal error message that is to be reported.
+.ds Ha fatal error procedure, which should not return, \
+or the nonfatal error procedure, which usually returns
+.IP \fIhandler\fP 1i
+Specifies the new \*(Ha.
+.ds Me reported
+.IP \fImessage\fP 1i
+Specifies the message that is to be \*(Me.
+.SH DESCRIPTION
+The
+.ZN XtAppError
+function calls the installed error procedure and passes the specified message.
+.LP
+The
+.ZN XtAppSetErrorHandler
+function registers the specified procedure,
+which is called when a fatal error condition occurs.
+.LP
+The
+.ZN XtAppSetWarningHandler
+registers the specified procedure,
+which is called when a nonfatal error condition occurs.
+.LP
+The
+.ZN XtAppWarning
+function calls the installed nonfatal error procedure and passes the
+specified message.
+.SH "SEE ALSO"
+XtAppGetErrorDatabase(__libmansuffix__),
+XtAppErrorMsg(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtAppErrorMsg.man b/man/XtAppErrorMsg.man
new file mode 100644 (file)
index 0000000..05f411a
--- /dev/null
@@ -0,0 +1,190 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtApp-Error-Msg XtApp-Set-Error-Msg-Handler XtApp-Set-Warning-Msg-Handler XtApp-Warning-Msg wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtAppErrorMsg __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtAppErrorMsg, XtAppSetErrorMsgHandler, XtAppSetWarningMsgHandler, XtAppWarningMsg \- high-level error handlers
+.SH SYNTAX
+.HP
+void XtAppErrorMsg(XtAppContext \fIapp_context\fP, String \fIname\fP, String
+\fItype\fP, String \fIclass\fP, String \fIdefault\fP, String *\fIparams\fP,
+Cardinal *\fInum_params\fP);
+.HP
+void XtAppSetErrorMsgHandler(XtAppContext \fIapp_context\fP, XtErrorMsgHandler
+\fImsg_handler\fP);
+.HP
+void XtAppSetWarningMsgHandler(XtAppContext \fIapp_context\fP,
+XtErrorMsgHandler \fImsg_handler\fP);
+.HP
+void XtAppWarningMsg(XtAppContext \fIapp_context\fP, String \fIname\fP, String
+\fItype\fP, String \fIclass\fP, String \fIdefault\fP, String *\fIparams\fP,
+Cardinal *\fInum_params\fP);
+.SH ARGUMENTS
+.IP \fIapp_context\fP 1i
+Specifies the application context.
+.ds Cl
+.IP \fIclass\fP 1i
+Specifies the resource class\*(Cl.
+.IP \fIdefault\fP 1i
+Specifies the default message to use\*(Dm.
+.IP \fIname\fP 1i
+Specifies the general kind of error.
+.IP \fItype\fP 1i
+Specifies the detailed name of the error.
+.ds Mh fatal error procedure, which should not return \
+or the nonfatal error procedure, which usually returns
+.IP \fImsg_handler\fP 1i
+Specifies the new \*(Mh.
+.IP \fInum_params\fP 1i
+Specifies the number of values in the parameter list.
+.IP \fIparams\fP 1i
+Specifies a pointer to a list of values to be stored in the message.
+.SH DESCRIPTION
+The
+.ZN XtAppErrorMsg
+function calls the high-level error handler and passes the specified
+information.
+.LP
+The
+.ZN XtAppSetErrorMsgHandler
+function registers the specified  procedure,
+which is called when a fatal error occurs.
+.LP
+The
+.ZN XtAppSetWarningMsgHandler
+function registers the specified procedure,
+which is called when a nonfatal error condition occurs.
+.LP
+The
+.ZN XtAppWarningMsg
+function calls the high-level error handler and passes the specified
+information.
+.SH "SEE ALSO"
+XtAppGetErrorDatabase(__libmansuffix__),
+XtAppError(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtAppGetErrorDatabase.man b/man/XtAppGetErrorDatabase.man
new file mode 100644 (file)
index 0000000..d4f43aa
--- /dev/null
@@ -0,0 +1,176 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtApp-Get-Error-Database XtApp-Get-Error-Database-Text wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtAppGetErrorDatabase __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtAppGetErrorDatabase, XtAppGetErrorDatabaseText \- obtain error database
+.SH SYNTAX
+.HP
+XrmDatabase *XtAppGetErrorDatabase(\^XtAppContext \fIapp_context\fP);
+.HP
+void XtAppGetErrorDatabaseText(XtAppContext \fIapp_context\fP, char
+*\fIname\fP, char *\fItype\fP, char *\fIclass\fP, char *\fIdefault\fP, char
+*\fIbuffer_return\fP, int \fInbytes\fP, XrmDatabase \fIdatabase\fP);
+.SH ARGUMENTS
+.IP \fIapp_context\fP 1i
+Specifies the application context.
+.IP \fIbuffer_return\fP 1i
+Specifies the buffer into which the error message is to be returned.
+.ds Cl \ of the error message
+.IP \fIclass\fP 1i
+Specifies the resource class\*(Cl.
+.IP \fIdatabase\fP 1i
+Specifies the name of the alternative database that is to be used
+or NULL if the application's database is to be used.
+.IP \fIdefault\fP 1i
+Specifies the default message to use\*(Dm.
+.IP \fIname\fP 1i
+.br
+.ns
+.IP \fItype\fP 1i
+Specifies the name and type that are concatenated to form the resource name
+of the error message.
+.IP \fInbytes\fP 1i
+Specifies the size of the buffer in bytes.
+.SH DESCRIPTION
+The
+.ZN XtAppGetErrorDatabase
+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
+.ZN XtAppGetErrorDatbaseText .
+.LP
+The
+.ZN XtAppGetErrorDatabaseText
+returns the appropriate message from the error database
+or returns the specified default message if one is not found in the
+error database.
+.SH "SEE ALSO"
+XtAppError(__libmansuffix__),
+XtAppErrorMsg(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtAppGetErrorDatabaseText.man b/man/XtAppGetErrorDatabaseText.man
new file mode 100644 (file)
index 0000000..e9bf5b4
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAppGetErrorDatabase.__libmansuffix__
diff --git a/man/XtAppGetExitFlag.man b/man/XtAppGetExitFlag.man
new file mode 100644 (file)
index 0000000..0601c62
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAppSetExitFlag.__libmansuffix__
diff --git a/man/XtAppGetSelectionTimeout.man b/man/XtAppGetSelectionTimeout.man
new file mode 100644 (file)
index 0000000..ef5d0f4
--- /dev/null
@@ -0,0 +1,162 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtApp-Get-Selection-Timeout XtApp-Set-Selection-Timeout wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtAppGetSelectionTimeout __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtAppGetSelectionTimeout, XtAppSetSelectionTimeout \- set and obtain selection timeout values
+.SH SYNTAX
+.HP
+unsigned long XtAppGetSelectionTimeout(XtAppContext \fIapp_context\fP);
+.HP
+void XtAppSetSelectionTimeout(XtAppContext \fIapp_context\fP, unsigned long
+\fItimeout\fP);
+.SH ARGUMENTS
+.IP \fIapp_context\fP 1i
+Specifies the application context.
+.IP \fItimeout\fP 1i
+Specifies the selection timeout in milliseconds.
+.SH DESCRIPTION
+The
+.ZN XtAppGetSelectionTimeout
+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
+.ZN selectionTimeout
+application resource, or, if
+.ZN selectionTimeout
+is not specified,
+it defaults to five seconds.
+.LP
+The
+.ZN XtAppSetSelectionTimeout
+function sets the \*(xI's selection timeout mechanism.
+Note that most applications should not set the selection timeout.
+.SH "SEE ALSO"
+XtOwnSelection(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtAppInitialize.man b/man/XtAppInitialize.man
new file mode 100644 (file)
index 0000000..e8b2276
--- /dev/null
@@ -0,0 +1,205 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtApp-Initialize XtVa-App-Initialize
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtAppInitialize __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtAppInitialize, XtVaAppInitialize \- initialize, open, or close a display
+.SH SYNTAX
+.HP
+Widget XtAppInitialize(XtAppContext* \fIapp_context_return\fP, String
+\fIapplication_class\fP, XrmOptionDescRec* \fIoptions\fP, Cardinal
+\fInum_options\fP, int* \fIargc_in_out\fP, String* \fIargv_in_out\fP, String*
+\fIfallback_resources\fP, ArgList \fIargs\fP, Cardinal \fInum_args\fP);
+.HP
+Widget XtVaAppInitialize(XtAppContext* \fIapp_context_return\fP, String
+\fIapplication_class\fP, XrmOptionDescRec* \fIoptions\fP, Cardinal
+\fInum_options\fP, int* \fIargc_in_out\fP, String* \fIargv_in_out\fP, String*
+\fIfallback_resources\fP, ...\^);
+.SH ARGUMENTS
+.IP \fIapp_context_return\fP 1i
+Specifies the application context.
+.ds Ac , which usually is the generic name for all instances of this application
+.IP \fIapplication_class\fP 1i
+Specifies the class name of this application\*(Ac.
+.IP \fIoptions\fP 1i
+Specifies how to parse the command line for any application-specific resources.
+The options argument is passed as a parameter to
+.ZN XrmParseCommand .
+For further information,
+see \fI\*(xL\fP.
+.IP \fInum_options\fP 1i
+Specifies the number of entries in the options list.
+.IP \fIargc_in_out\fP 1i
+Specifies a pointer to the number of command line parameters.
+.IP \fIargv_in_out\fP 1i
+Specifies the command line parameters.
+.IP \fIfallback_resources\fP 1i
+Specifies resource values to be used if the application class resource
+file cannot be opened or read, or NULL.
+.IP \fIargs\fP 1i
+Specifies the argument list to override any other resource specification
+for the created shell widget.
+.IP \fInum_args\fP 1i
+Specifies the number of entries in the argument list.
+.IP \fI...\fP 1i
+Specifies the variable argument list to override any other resource
+specification for the created shell widget.
+.SH DESCRIPTION
+The
+.ZN XtAppInitialize
+function calls
+.ZN XtToolkitInitialize
+followed by
+.ZN XtCreateApplicationContext ,
+then calls
+.ZN XtOpenDisplay
+with \fIdisplay_string\fP NULL and \fIapplication_name\fP NULL, and
+finally calls
+.ZN XtAppCreateShell
+with \fIapplication_name\fP NULL, \fIwidget_class\fP
+.ZN applicationShellWidgetClass ,
+and the specified \fIargs\fP and \fInum_args\fP and returns the
+created shell. The modified \fIargc\fP and \fIargv\fP returned by
+.ZN XtDisplayInitialize
+are returned in \fIargc_in_out\fP and \fIargv_in_out\fP. If
+\fIapp_context_return\fP is not NULL, the created application context
+is also returned. If the display specified by the command line cannot
+be opened, an error message is issued and
+.ZN XtAppInitialize
+terminates the application. If \fIfallback_resources\fP is non-NULL,
+.ZN XtAppSetFallbackResources
+is called with the value prior to calling
+.ZN XtOpenDisplay .
+.LP
+XtAppInitialize and XtVaAppInitialize have been superceded by
+.ZN XtOpenApplication
+and
+.ZN XtVaOpenApplication
+respectively.
+.SH "SEE ALSO"
+XtOpenApplication(__libmansuffix__), XtVaOpenApplication(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtAppLock.man b/man/XtAppLock.man
new file mode 100644 (file)
index 0000000..05de3eb
--- /dev/null
@@ -0,0 +1,146 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtApp-Lock XtApp-Unlock wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtAppLock __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtAppLock, XtAppUnlock \- lock and unlock application context
+.SH SYNTAX
+.HP
+void XtAppLock(XtAppContext \fIapp_context\fP);
+.HP
+void XtAppUnlock(XtAppContext \fIapp_context\fP);
+.SH ARGUMENTS
+.IP \fIapp_context\fP 1i
+Specifies the application context.
+.SH DESCRIPTION
+.ZN XtAppLock
+locks the application context including all its related displays and widgets.
+.LP
+.ZN XtAppUnlock
+unlocks the application context.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtAppMainLoop.man b/man/XtAppMainLoop.man
new file mode 100644 (file)
index 0000000..89b2e7b
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAppNextEvent.__libmansuffix__
diff --git a/man/XtAppNextEvent.man b/man/XtAppNextEvent.man
new file mode 100644 (file)
index 0000000..8169c63
--- /dev/null
@@ -0,0 +1,280 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtApp-Next-Event XtApp-Pending XtApp-Peek-Event XtApp-Process-Event Xt-Dispatch-Event XtApp-Main-Loop wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtAppNextEvent __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtAppNextEvent, XtAppPending, XtAppPeekEvent, XtAppProcessEvent, XtDispatchEvent, XtAppMainLoop \- query and process events and input
+.SH SYNTAX
+.HP
+void XtAppNextEvent(XtAppContext \fIapp_context\fP, XEvent
+*\fIevent_return\fP);
+.HP
+Boolean XtAppPeekEvent(XtAppContext \fIapp_context\fP, XEvent
+*\fIevent_return\fP);
+.HP
+XtInputMask XtAppPending(XtAppContext \fIapp_context\fP);
+.HP
+void XtAppProcessEvent(XtAppContext \fIapp_context\fP, XtInputMask
+\fImask\fP);
+.HP
+Boolean XtDispatchEvent(XEvent *\fIevent\fP);
+.HP
+void XtAppMainLoop(XtAppContext \fIapp_context\fP);
+.SH ARGUMENTS
+.ds Co that identifies the application
+.IP \fIapp_context\fP 1i
+Specifies the application context \*(Co.
+.IP \fIevent\fP 1i
+Specifies a pointer to the event structure that is to be dispatched
+to the appropriate event handler.
+.IP \fIevent_return\fP 1i
+Returns the event information to the specified event structure.
+.IP \fImask\fP 1i
+Specifies what types of events to process.
+The mask is the bitwise inclusive OR of any combination of
+.ZN XtIMXEvent ,
+.ZN XtIMTimer ,
+.ZN XtIMAlternateInput ,
+and
+.ZN XtIMSignal .
+As a convenience, the \*(tk defines the symbolic name
+.ZN XtIMAll
+to be the bitwise inclusive OR of all event types.
+.SH DESCRIPTION
+If the X event queue is empty,
+.ZN XtAppNextEvent
+flushes the X output buffers of each Display in the application context
+and waits for an event while looking at the other input sources, timeout
+timeout values, and signal handlers and calling any callback procedures
+triggered by them.  This wait time can be used for background processing
+(see Section 7.8).
+.LP
+If there is an event in the queue,
+.ZN XtAppPeekEvent
+fills in the event and returns a nonzero value. If no X input is on the
+queue,
+.ZN XtAppPeekEvent
+flushes the output buffer and blocks until input is available
+(possibly calling some timeout callbacks in the process).
+If the input is an event,
+.ZN XtAppPeekEvent
+fills in the event and returns a nonzero value.
+Otherwise, the input is for an alternate input source, and
+.ZN XtAppPeekEvent
+returns zero.
+.LP
+The
+.ZN XtAppPending
+function returns a nonzero value if there are events pending from the
+X server, timer pending, or other input sources pending. The value
+returned is a bit mask that is the OR of
+.ZN XtIMXEvent ,
+.ZN XtIMTimer ,
+.ZN XtIMAlternateInput ,
+and
+.ZN XtIMSignal
+(see
+.ZN XtAppProcessEvent ).
+If there are no events pending,
+.ZN XtAppPending
+flushes the output buffer and returns zero.
+.LP
+The
+.ZN XtAppProcessEvent
+function processes one timer, alternate input, signal source, or X
+event.  If there is nothing of the appropriate type to process,
+.ZN XtAppProcessEvent
+blocks until there is.
+If there is more than one type of thing available to process,
+it is undefined which will get processed.
+Usually, this procedure is not called by client applications (see
+.ZN XtAppMainLoop ).
+.ZN XtAppProcessEvent
+processes timer events by calling any appropriate timer callbacks,
+alternate input by calling any appropriate alternate input callbacks,
+signal source by calling any appropriate signal callbacks, and X events
+by calling
+.ZN XtDispatchEvent .
+.LP
+When an X event is received, it is passed to
+.ZN XtDispatchEvent ,
+which calls the appropriate event handlers
+and passes them the widget, the event, and client-specific data
+registered with each procedure.
+If there are no handlers for that event registered,
+the event is ignored and the dispatcher simply returns.
+The order in which the handlers are called is undefined.
+.LP
+The
+.ZN XtDispatchEvent
+function sends those events to the event handler functions that
+have been previously registered with the dispatch routine.
+.ZN XtDispatchEvent
+returns
+.ZN True
+if it dispatched the event to some handler and
+.ZN False
+if it found no handler to dispatch the event to.
+The most common use of
+.ZN XtDispatchEvent
+is to dispatch events acquired with the
+.ZN XtAppNextEvent
+procedure.
+However, it also can be used to dispatch user-constructed events.
+.ZN XtDispatchEvent
+also is responsible for implementing the grab semantics for
+.ZN XtAddGrab .
+.LP
+The
+.ZN XtAppMainLoop
+function first reads the next incoming X event by calling
+.ZN XtAppNextEvent
+and then it dispatches the event to the appropriate registered procedure
+by calling
+.ZN XtDispatchEvent .
+This constitutes the main loop of \*(tk applications,
+and, as such, it does not return unless
+.ZN XtAppSetExitFlag
+is called.
+Applications are expected to exit in response to some user action.
+There is nothing special about
+.ZN XtAppMainLoop ;
+it is simply an loop that calls
+.ZN XtAppNextEvent
+and then
+.ZN XtDispatchEvent ,
+until
+.ZN XtAppGetExitFlag ()
+returns true.
+.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
+.ZN XtAppNextEvent .
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtAppPeekEvent.man b/man/XtAppPeekEvent.man
new file mode 100644 (file)
index 0000000..89b2e7b
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAppNextEvent.__libmansuffix__
diff --git a/man/XtAppPending.man b/man/XtAppPending.man
new file mode 100644 (file)
index 0000000..89b2e7b
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAppNextEvent.__libmansuffix__
diff --git a/man/XtAppProcessEvent.man b/man/XtAppProcessEvent.man
new file mode 100644 (file)
index 0000000..89b2e7b
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAppNextEvent.__libmansuffix__
diff --git a/man/XtAppReleaseCacheRefs.man b/man/XtAppReleaseCacheRefs.man
new file mode 100644 (file)
index 0000000..50bc547
--- /dev/null
@@ -0,0 +1,149 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtApp-Release-Cache-Refs wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtAppReleaseCacheRefs __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtAppReleaseCacheRefs \- decrement reference counts for resources
+.SH SYNTAX
+.HP
+void XtAppReleaseCacheRefs(XtAppContext \fIapp_context\fP, XtCacheRef*
+\fIrefs\fP);
+.SH ARGUMENTS
+.IP \fIapp_context\fP 1i
+Specifies the application context.
+.IP \fIrefs\fP 1i
+Specifies the list of cache references to be released.
+.SH DESCRIPTION
+.ZN XtAppReleaseCacheRefs
+decrements the reference count for the conversion entries identified
+by the \fIrefs\fP argument. This argument is a pointer to a NULL-terminated
+list of
+.ZN XtCacheRef
+values. If any reference count reaches zero, the destructor, if any, will
+be called and the resource removed from the conversion cache.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtAppSetErrorHandler.man b/man/XtAppSetErrorHandler.man
new file mode 100644 (file)
index 0000000..8162df2
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAppError.__libmansuffix__
diff --git a/man/XtAppSetErrorMsgHandler.man b/man/XtAppSetErrorMsgHandler.man
new file mode 100644 (file)
index 0000000..eebf6de
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAppErrorMsg.__libmansuffix__
diff --git a/man/XtAppSetExitFlag.man b/man/XtAppSetExitFlag.man
new file mode 100644 (file)
index 0000000..92eed63
--- /dev/null
@@ -0,0 +1,146 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtApp-Set-Exit-Flag XtApp-Get-Exit-Flag wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtAppSetExitFlag __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtAppSetExitFlag, XtAppGetExitFlag \- thread support functions
+.SH SYNTAX
+.HP
+void XtAppSetExitFlag(XtAppContext \fIapp_context\fP);
+.HP
+Boolean XtAppGetExitFlag(XtAppContext \fIapp_context\fP);
+.SH ARGUMENTS
+.IP \fIapp_context\fP 1i
+Specifies the application context.
+.SH DESCRIPTION
+To indicate that an application context should exit, use
+.ZN XtAppSetExitFlag .
+.LP
+To test the exit status of an application context, use
+.ZN XtAppGetExitFlag .
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtAppSetFallbackResources.man b/man/XtAppSetFallbackResources.man
new file mode 100644 (file)
index 0000000..e1d5556
--- /dev/null
@@ -0,0 +1,164 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtApp-Set-Fallback-Resources wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtAppSetFallbackResources __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtAppSetFallbackResources \- set fallback resources
+.SH SYNTAX
+.HP
+void XtAppSetFallbackResources(XtAppContext \fIapp_context\fP, String*
+\fIspecification_list\fP);
+.SH ARGUMENTS
+.IP \fIapp_context\fP 1i
+Specifies the application context.
+.IP \fIspecification_list\fP 1i
+Specifies a NULL-terminated list of resource specifications to pre-load
+the database, or NULL.
+.SH DESCRIPTION
+Each entry in \fIspecification_list\fP points to a string in the format
+.ZN XrmPutLineResource .
+following a call to
+.ZN XtAppSetFallbackResources ,
+when a resource database is being created for a particular screen and
+the Intrinsics are not able to find or read an application-specific
+class resource file and if \fIspecification_list\fP is not NULL the
+resource specification in \fIspecification_list\fP will be merged
+into the screen resource database in place of the application-specific
+class resource file.
+.ZN XtAppSetFallbackResources
+is not required to copy \fIspecification_list\fP; the caller must
+ensure that the contents of the list and the strings addressed by the
+list remain valid until all displays are initialized or until
+.ZN XtAppSetFallbackResources
+is called again. The value NULL for \fIspecification_list\fP removes
+any previous fallback resource specification for the application context.
+The intended use for fallback resources is to provide a minimal number
+of resources that will make the application usable (or at least terminate
+with helpful diagnostic messages) when some problem exists in finding
+and loading the application defaults file.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtAppSetSelectionTimeout.man b/man/XtAppSetSelectionTimeout.man
new file mode 100644 (file)
index 0000000..5c0083a
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAppGetSelectionTimeout.__libmansuffix__
diff --git a/man/XtAppSetTypeConverter.man b/man/XtAppSetTypeConverter.man
new file mode 100644 (file)
index 0000000..1f6344c
--- /dev/null
@@ -0,0 +1,172 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtApp-Set-Type-Converter XtSet-Type-Converter wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtAppSetTypeConverter __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtAppSetTypeConverter, XtSetTypeConverter \- register resource converter
+.SH SYNTAX
+.HP
+void XtAppSetTypeConverter(XtAppContext \fIapp_context\fP, String
+\fIfrom_type\fP, String \fIto_type\fP, XtConverter \fIconverter\fP,
+XtConvertArgList \fIconvert_args\fP, Cardinal \fInum_args\fP, XtCacheType
+\fIcache_type\fP, XtDestructor \fIdestructor\fP);
+.HP
+void XtSetTypeConverter(String \fIfrom_type\fP, String \fIto_type\fP,
+XtConverter \fIconverter\fP, XtConvertArgList \fIconvert_args\fP, Cardinal
+\fInum_args\fP, XtCacheType \fIcache_type\fP, XtDestructor \fIdestructor\fP);
+.SH ARGUMENTS
+.IP \fIapp_context\fP 1i
+Specifies the application context.
+.IP \fIconverter\fP 1i
+Specifies the type converter procedure.
+.IP \fIconvert_args\fP 1i
+Specifies how to compute the additional arguments to the converter or NULL.
+.IP \fIfrom_type\fP 1i
+Specifies the source type.
+.IP \fInum_args\fP 1i
+Specifies the number of additional arguments to the converter or zero.
+.IP \fIto_type\fP 1i
+Specifies the destination type.
+.IP \fIcache_type\fP 1i
+Specifies whether or not resources produced by this converter are
+sharable or display-specific and when they should be freed.
+.IP \fIdestructor\fP 1i
+Specifies a destroy procedure for resources produced by this conversion,
+or NULL if no additional action is required to deallocate resources
+produced by the converter.
+.SH DESCRIPTION
+.ZN XtSetTypeConverter
+registers the specified type converter and destructor in all application
+contexts created by the calling process, including any future application
+contexts that may be created.
+.ZN XtAppSetTypeConverter
+registers the specified type converter in the single application context
+specified. If the same \fIfrom_type\fP and \fIto_type\fP are specified
+in multiple calls to either function, the most recent overrides the
+previous ones.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtAppSetWarningHandler.man b/man/XtAppSetWarningHandler.man
new file mode 100644 (file)
index 0000000..8162df2
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAppError.__libmansuffix__
diff --git a/man/XtAppSetWarningMsgHandler.man b/man/XtAppSetWarningMsgHandler.man
new file mode 100644 (file)
index 0000000..eebf6de
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAppErrorMsg.__libmansuffix__
diff --git a/man/XtAppUnlock.man b/man/XtAppUnlock.man
new file mode 100644 (file)
index 0000000..0e541c7
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAppLock.__libmansuffix__
diff --git a/man/XtAppWarning.man b/man/XtAppWarning.man
new file mode 100644 (file)
index 0000000..8162df2
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAppError.__libmansuffix__
diff --git a/man/XtAppWarningMsg.man b/man/XtAppWarningMsg.man
new file mode 100644 (file)
index 0000000..eebf6de
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAppErrorMsg.__libmansuffix__
diff --git a/man/XtAsprintf.man b/man/XtAsprintf.man
new file mode 100644 (file)
index 0000000..50eaf76
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtMalloc.__libmansuffix__
diff --git a/man/XtAugmentTranslations.man b/man/XtAugmentTranslations.man
new file mode 100644 (file)
index 0000000..4f4cdde
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtParseTranslationTable.__libmansuffix__
diff --git a/man/XtBuildEventMask.man b/man/XtBuildEventMask.man
new file mode 100644 (file)
index 0000000..32ba4a9
--- /dev/null
@@ -0,0 +1,154 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtBuild-Event-Mask wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtBuildEventMask __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtBuildEventMask \- retrieve a widget's event mask
+.SH SYNTAX
+.HP
+EventMask XtBuildEventMask(Widget \fIw\fP);
+.SH ARGUMENTS
+.IP \fIw\fP 1i
+Specifies the widget.
+.SH DESCRIPTION
+The
+.ZN XtBuildEventMask
+function returns the event mask representing the logical OR
+of all event masks for event handlers registered on the widget with
+.ZN XtAddEventHandler
+and all event translations, including accelerators,
+installed on the widget.
+This is the same event mask stored into the
+.ZN XSetWindowAttributes
+structure by
+.ZN XtRealizeWidget
+and sent to the server when event handlers and translations are installed or
+removed on the realized widget.
+.SH "SEE ALSO"
+XtAddEventHandler(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtCallAcceptFocus.man b/man/XtCallAcceptFocus.man
new file mode 100644 (file)
index 0000000..a0dc954
--- /dev/null
@@ -0,0 +1,152 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtCall-Accept-Focus wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtCallAcceptFocus __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtCallAcceptFocus \- calla widget's accept_focus procedure
+.SH SYNTAX
+.HP
+Boolean XtCallAcceptFocus(Widget \fIw\fP, Time *\fItime\fP);
+.SH ARGUMENTS
+.IP \fItime\fP 1i
+Specifies the X time of the event that is causing the accept focus.
+.IP \fIw\fP 1i
+Specifies the widget.
+.SH DESCRIPTION
+The
+.ZN XtCallAcceptFocus
+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 accept_focus is NULL,
+.ZN XtCallAcceptFocus
+returns
+.ZN False .
+.SH "SEE ALSO"
+XtSetKeyboardFocus(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtCallActionProc.man b/man/XtCallActionProc.man
new file mode 100644 (file)
index 0000000..93cac71
--- /dev/null
@@ -0,0 +1,159 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtCall-Action-Proc wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtCallActionProc __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtCallActionProc \- invoke an action procedure directly
+.SH SYNTAX
+.HP
+void XtCallActionProc(Widget \fIwidget\fP, String \fIaction\fP, XEvent*
+\fIevent\fP, String* \fIparams\fP, Cardinal \fInum_params\fP);
+.SH ARGUMENTS
+.IP \fIwidget\fP 1i
+Specifies the widget in which the action is to be invoked. Must be
+of class core of any subclass thereof.
+.IP \fIaction\fP 1i
+Specifies the name of the action routine.
+.IP \fIevent\fP 1i
+Specifies the contents of the \fIevent\fP passed to the action routine.
+.IP \fIparams\fP 1i
+Specifies the contents of the \fIparams\fP passed to the action routine.
+.IP \fInum_params\fP 1i
+Specifies the num of entries in \fIparams\fP.
+.SH DESCRIPTION
+.ZN XtCallActionProc
+searches for the named action routine in the same manner and order as
+translation tables are bound. 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 \fIevent\fP,
+\fIparams\fP, and \fInum_params\fP arguments are appropriate for the
+specified routine, and if necessary, that the specified widget is
+realized or sensitive. If the named action routine cannot be found,
+.ZN XtCallActionProc
+generates a warning message and returns.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtCallCallbackList.man b/man/XtCallCallbackList.man
new file mode 100644 (file)
index 0000000..c254850
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtCallCallbacks.__libmansuffix__
diff --git a/man/XtCallCallbacks.man b/man/XtCallCallbacks.man
new file mode 100644 (file)
index 0000000..d867a52
--- /dev/null
@@ -0,0 +1,184 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtCall-Callbacks XtHas-Callbacks XtCall-Callbacks-List wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtCallCallbacks __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtCallCallbacks, XtCallCallbackList, XtHasCallbacks \- process callbacks
+.SH SYNTAX
+.HP
+void XtCallCallbacks(Widget \fIw\fP, String \fIcallback_name\fP, XtPointer
+\fIcall_data\fP);
+.HP
+void XtCallCallbackList(Widget \fIw\fP, XtCallbackList \fIcallbacks\fP,
+XtPointer \fIcall_data\fP);
+.LP
+typedef enum {XtCallbackNoList, XtCallbackHasNone, XtCallbackHasSome}
+XtCallbackStatus;
+.HP
+XtCallbackStatus XtHasCallbacks(Widget \fIw\fP, String \fIcallback_name\fP);
+.SH ARGUMENTS
+.ds Cn \ to be executed or checked
+.IP \fIcallback_name\fP 1i
+Specifies the callback list\*(Cn.
+.IP \fIcall_data\fP 1i
+Specifies a callback-list specific data value to pass to each of the callback
+procedure in the list.
+.IP \fIcallbacks\fP 1i
+Specifies the callback list to be executed.
+.IP \fIw\fP 1i
+Specifies the widget.
+.SH DESCRIPTION
+The
+.ZN XtCallCallbacks
+function calls each procedure that is registered in the specified widget's
+callback list.
+.LP
+If \fIcallbacks\fP is not NULL,
+.ZN XtCallCallbackList
+calls each of the callback procedures in the list, passing client data
+and \fIcall_data\fP. The \fIcallbacks\fP parameter must specify the
+contents of a widget or object resource declared with representation
+type
+.ZN XtRCallback .
+.LP
+The
+.ZN XtHasCallbacks
+function first checks to see if the widget has a callback list identified
+by callback_name.
+If the callback list does not exist,
+.ZN XtHasCallbacks
+returns
+.ZN XtCallbackNoList .
+If the callback list exists but is empty,
+it returns
+.ZN XtCallbackHasNone .
+If the callback list exists and has at least one callback registered,
+it returns
+.ZN XtCallbackHasSome .
+.SH "SEE ALSO"
+XtAddCallback(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtCallConverter.man b/man/XtCallConverter.man
new file mode 100644 (file)
index 0000000..ab31ca4
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtConvertAndStore.__libmansuffix__
diff --git a/man/XtCallbackExclusive.man b/man/XtCallbackExclusive.man
new file mode 100644 (file)
index 0000000..0267c01
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtPopup.__libmansuffix__
diff --git a/man/XtCallbackNone.man b/man/XtCallbackNone.man
new file mode 100644 (file)
index 0000000..0267c01
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtPopup.__libmansuffix__
diff --git a/man/XtCallbackNonexclusive.man b/man/XtCallbackNonexclusive.man
new file mode 100644 (file)
index 0000000..0267c01
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtPopup.__libmansuffix__
diff --git a/man/XtCallbackPopdown.man b/man/XtCallbackPopdown.man
new file mode 100644 (file)
index 0000000..e40b612
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtPopdown.__libmansuffix__
diff --git a/man/XtCalloc.man b/man/XtCalloc.man
new file mode 100644 (file)
index 0000000..50eaf76
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtMalloc.__libmansuffix__
diff --git a/man/XtCancelSelectionRequest.man b/man/XtCancelSelectionRequest.man
new file mode 100644 (file)
index 0000000..e6df724
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtCreateSelectionRequest.__libmansuffix__
diff --git a/man/XtChangeManagedSet.man b/man/XtChangeManagedSet.man
new file mode 100644 (file)
index 0000000..98b4bb6
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtManageChildren.__libmansuffix__
diff --git a/man/XtCheckSubclass.man b/man/XtCheckSubclass.man
new file mode 100644 (file)
index 0000000..99800c9
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtClass.__libmansuffix__
diff --git a/man/XtClass.man b/man/XtClass.man
new file mode 100644 (file)
index 0000000..0a850e0
--- /dev/null
@@ -0,0 +1,240 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtCheck-Subclass XtIs-Object XtIs-RectObj XtIs-Widget XtIs-Composite XtIs-Constraint XtIs-Shell XtIs-Override-Shell XtIs-WM-Shell XtIs-Vendor-Shell XtIs-Transient-Shell XtIs-Top-Level-Shell XtIs-Application-Shell wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtClass __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtClass, XtSuperclass, XtIsSubclass, XtCheckSubclass, XtIsObject, XtIsRectObj, XtIsWidget, XtIsComposite, XtIsConstraint, XtIsShell, XtIsOverrideShell, XtIsWMShell, XtIsVendorShell, XtIsTransientShell, XtIsTopLevelShell, XtIsApplicationShell, XtIsSessionShell \- obtain and verify a widget's class
+.SH SYNTAX
+.HP
+WidgetClass XtClass(Widget \fIw\fP);
+.HP
+WidgetClass XtSuperclass(Widget \fIw\fP);
+.HP
+Boolean XtIsSubclass(Widget \fIw\fP, WidgetClass \fIwidget_class\fP);
+.HP
+void XtCheckSubclass(Widget \fIwidget\fP, WidgetClass \fIwidget_class\fP,
+String \fImessage\fP);
+.HP
+Boolean XtIsObject(Widget \fIw\fP);
+.HP
+Boolean XtIsRectObj(Widget \fIw\fP);
+.HP
+Boolean XtIsWidget(Widget \fIw\fP);
+.HP
+Boolean XtIsComposite(Widget \fIw\fP);
+.HP
+Boolean XtIsConstraint(Widget \fIw\fP,
+.HP
+Boolean XtIsShell(Widget \fIw\fP);
+.HP
+Boolean XtIsOverrideShell(Widget \fIw\fP);
+.HP
+Boolean XtIsWMShell(Widget \fIw\fP);
+.HP
+Boolean XtIsVendorShell(Widget \fIw\fP);
+.HP
+Boolean XtIsTransientShell(Widget \fIw\fP);
+.HP
+Boolean XtIsTopLevelShell(Widget \fIw\fP);
+.HP
+Boolean XtIsApplicationShell(Widget \fIw\fP);
+.HP
+Boolean XtIsSessionShell(Widget \fIw\fP);
+.SH ARGUMENTS
+.IP \fIw\fP 1i
+Specifies the widget.
+.IP \fIwidget_class\fP 1i
+Specifies the widget class\*(Wc.
+.ds Me used
+.IP \fImessage\fP 1i
+Specifies the message that is to be \*(Me.
+.SH DESCRIPTION
+The
+.ZN XtClass
+function returns a pointer to the widget's class structure.
+.LP
+The
+.ZN XtSuperclass
+function returns a pointer to the widget's superclass class structure.
+.LP
+The
+.ZN XtIsSubclass
+function returns
+.ZN True
+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
+.ZN XtIsSubclass
+to find out if a widget belongs to the desired class of objects.
+.LP
+The
+.ZN XtCheckSubclass
+macro determines if the class of the specified widget is equal to
+or is a subclass of the specified widget class.
+The widget can be any number of subclasses down the chain
+and need not be an immediate subclass of the specified widget class.
+If the specified widget is not a subclass,
+.ZN XtCheckSubclass
+constructs an error message from the supplied message,
+the widget's actual class, and the expected class and calls
+.ZN XtErrorMsg .
+.ZN XtCheckSubclass
+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.
+.LP
+.ZN XtCheckSubclass
+is only executed when the widget has been compiled with the compiler symbol
+DEBUG defined; otherwise, it is defined as the empty string
+and generates no code.
+.LP
+To test if a given widget belongs to a subclass of an Intrinsics-defined
+class, the Intrinsics defines macros or functions equivalent to
+.ZN XtIsSubclass
+for each of the built-in classes. These procedures are
+.ZN XtIsObject ,
+.ZN XtIsRectObj ,
+.ZN XtIsWidget ,
+.ZN XtIsComposite ,
+.ZN XtIsConstraint ,
+.ZN XtIsShell ,
+.ZN XtIsOverrideShell ,
+.ZN XtIsWMShell ,
+.ZN XtIsVendorShell ,
+.ZN XtIsTransientShell ,
+.ZN XtIsTopLevelShell ,
+.ZN XtIsApplicationShell ,
+and
+.ZN XtIsSessionShell .
+.LP
+The
+.SH "SEE ALSO"
+XtAppErrorMsg(__libmansuffix__),
+XtDisplay(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtCloseDisplay.man b/man/XtCloseDisplay.man
new file mode 100644 (file)
index 0000000..0a0994c
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtDisplayInitialize.__libmansuffix__
diff --git a/man/XtConfigureWidget.man b/man/XtConfigureWidget.man
new file mode 100644 (file)
index 0000000..a760991
--- /dev/null
@@ -0,0 +1,220 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtConfigure-Widget XtMove-Widget XtResize-Widget wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtConfigureWidget __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtConfigureWidget, XtMoveWidget, XtResizeWidget \- move and resize widgets
+.SH SYNTAX
+.HP
+void XtConfigureWidget(Widget \fIw\fP, Position \fIx\fP, Position \fIy\fP,
+Dimension \fIwidth\fP, Dimension \fIheight\fP, Dimension \fIborder_width\fP);
+.HP
+void XtMoveWidget(Widget \fIw\fP, Position \fIx\fP, Position \fIy\fP);
+.HP
+void XtResizeWidget(Widget \fIw\fP, Dimension \fIwidth\fP, Dimension
+\fIheight\fP, Dimension \fIborder_width\fP);
+.HP
+void XtResizeWindow(Widget \fIw\fP);
+.SH ARGUMENTS
+.IP \fIwidth\fP 1i
+.br
+.ns
+.IP \fIheight\fP 1i
+.br
+.ns
+.IP \fIborder_width\fP 1i
+Specify the new widget size.
+.IP \fIw\fP 1i
+Specifies the widget.
+.ds Nu new widget
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the \*(Nu x and y coordinates.
+.SH DESCRIPTION
+The
+.ZN XtConfigureWidget
+function returns immediately if the specified geometry fields
+are the same as the old values.
+Otherwise,
+.ZN XtConfigureWidget
+writes the new x, y, width, height, and border_width values
+into the widget and, if the widget is realized, makes an Xlib
+.ZN XConfigureWindow
+call on the widget's window.
+.LP
+If either the new width or height is different from its old value,
+.ZN XtConfigureWidget
+calls the widget's resize procedure to notify it of the size change;
+otherwise, it simply returns.
+.LP
+The
+.ZN XtMoveWidget
+function returns immediately if the specified geometry fields
+are the same as the old values.
+Otherwise,
+.ZN XtMoveWidget
+writes the new x and y values into the widget
+and, if the widget is realized, issues an Xlib
+.ZN XMoveWindow
+call on the widget's window.
+.LP
+The
+.ZN XtResizeWidget
+function returns immediately if the specified geometry fields
+are the same as the old values.
+Otherwise,
+.ZN XtResizeWidget
+writes the new width, height, and border_width values into
+the widget and, if the widget is realized, issues an
+.ZN XConfigureWindow
+call on the widget's window.
+.LP
+If the new width or height are different from the old values,
+.ZN XtResizeWidget
+calls the widget's resize procedure to notify it of the size change.
+.LP
+The
+.ZN XtResizeWindow
+function calls the
+.ZN XConfigureWindow
+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 way to tell if these
+values match the current values.
+Note that the widget's resize procedure is not called.
+.LP
+There are very few times to use
+.ZN XtResizeWindow ;
+instead, you should use
+.ZN XtResizeWidget .
+.SH "SEE ALSO"
+XtMakeGeometryRequest(__libmansuffix__),
+XtQueryGeometry(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtConvert.man b/man/XtConvert.man
new file mode 100644 (file)
index 0000000..a30650d
--- /dev/null
@@ -0,0 +1,189 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtDirect-Convert wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtConvert __libmansuffix__ __xorgversion__ "XT COMPATIBILITY FUNCTIONS"
+.SH NAME
+XtConvert, XtDirectConvert \- invoke resource converters
+.SH SYNTAX
+.HP
+void XtConvert(Widget \fIw\fP, String \fIfrom_type\fP, XrmValuePtr \fIfrom\fP,
+String \fIto_type\fP, XrmValuePtr \fIto_return\fP);
+.HP
+void XtDirectConvert(XtConverter \fIconverter\fP, XrmValuePtr \fIargs\fP,
+Cardinal \fInum_args\fP, XrmValuePtr \fIfrom\fP, XrmValuePtr \fIto_return\fP);
+.SH ARGUMENTS
+.ds Al that contains the additional arguments needed to perform \
+the conversion (often NULL)
+.IP \fIargs\fP 1i
+Specifies the argument list \*(Al.
+.IP \fIconverter\fP 1i
+Specifies the conversion procedure that is to be called.
+.IP \fIfrom\fP 1i
+Specifies the value to be converted.
+.IP \fIfrom_type\fP 1i
+Specifies the source type.
+.IP \fInum_args\fP 1i
+Specifies the number of additional arguments (often zero).
+.IP \fIto_type\fP 1i
+Specifies the destination type.
+.IP \fIto_return\fP 1i
+Returns the converted value.
+.ds Wi to use for additional arguments (if any are needed)
+.IP \fIw\fP 1i
+Specifies the widget \*(Wi.
+.SH DESCRIPTION
+The
+.ZN XtConvert
+function looks up the type converter registered to convert from_type
+to to_type, computes any additional arguments needed, and then calls
+.ZN XtDirectConvert .
+.ZN XtConvert
+has been replaced by
+.ZN XtConvertAndStore .
+.LP
+The
+.ZN XtDirectConvert
+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.
+.LP
+Before calling the specified converter,
+.ZN XtDirectConvert
+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 to_return.address for non-NULL.
+.ZN XtDirectConvert
+has been replaced by
+.ZN XtCallConverter .
+.SH "SEE ALSO"
+XtAppAddConverter(__libmansuffix__),
+XtStringConversionWarning(__libmansuffix__),
+XtConvertAndStore(__libmansuffix__),
+XtCallConverter(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtConvertAndStore.man b/man/XtConvertAndStore.man
new file mode 100644 (file)
index 0000000..32068f4
--- /dev/null
@@ -0,0 +1,221 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtConvert-And-Store XtCall-Converter wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtConvertAndStore __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtConvertAndStore, XtCallConverter \- invoke resource converters
+.SH SYNTAX
+.HP
+Boolean XtConvertAndStore(Widget \fIwidget\fP, String \fIfrom_type\fP,
+XrmValuePtr \fIfrom\fP, String \fIto_type\fP, XrmValuePtr \fIto_in_out\fP);
+.HP
+Boolean XtCallConverter(Display* \fIdpy\fP, XtConverter \fIconverter\fP,
+XrmValuePtr \fIargs\fP, Cardinal \fInum_args\fP, XrmValuePtr \fIfrom\fP,
+XrmValuePtr \fIto_in_out\fP, XtCacheRef* \fIcache_ref_return\fP);
+.SH ARGUMENTS
+.IP \fIargs\fP 1i
+Specifies the argument list that contains the additional arguments needed
+to perform the conversion, or NULL.
+.IP \fIconverter\fP 1i
+Specifies the conversion procedure that is to be called.
+.IP \fIfrom\fP 1i
+Specifies the value to be converted.
+.IP \fIfrom_type\fP 1i
+Specifies the source type.
+.IP \fInum_args\fP 1i
+Specifies the number of additional arguments (often zero).
+.IP \fIto_type\fP 1i
+Specifies the destination type.
+.IP \fIto_in_out\fP 1i
+Returns the converted value.
+.IP \fIwidget\fP 1i
+Specifies the widget to use for additional arguments, if any are needed,
+and the destroy callback list.
+.IP \fIdpy\fP 1i
+Specifies the display with which the conversion is to be associated.
+.SH DESCRIPTION
+The
+.ZN XtConvertAndStore
+function looks up the type converter registered to convert from_type
+to to_type, computes any additional arguments needed, and then calls
+.ZN XtCallConverter .
+(or
+.ZN XtDirectConvert
+if an old-style converter was registered with
+.ZN XtAddConverter
+or
+.ZN XtAppAddConverter .
+) with the from and to_in_out arguments.
+.LP
+The
+.ZN XtCallConverter
+function looks up the specified type converter in the application
+context associated with the display and, if the converter was not
+registered or was registered with cache type
+.ZN XtCacheAll
+or
+.ZN XtCacheByDisplay
+looks in the conversion cache to see if this conversion procedure
+has been called with the specified conversion arguments. If so, it
+checks the success status of the prior call, and if the conversion
+failed,
+.ZN XtCallConverter
+returns
+.ZN False
+immediately; otherwise it checks the size specified in the \fIto\fP
+argument and, if it is greater than or equal to the size stored in the
+cache, copies the information stored in the cache into the location
+specified by \fIto->addr\fP, stores the cache size into \fIto->size\fP,
+and returns
+.ZN True .
+If the size specified in the \fIto\fP argument is smaller than the size
+stored in the cache,
+.ZN XtCallConverter
+copies the cache size into the \fIto->size\fP and returns
+.ZN False .
+If the converter was registered with cache type
+.ZN XtCacheNone
+or no value was found in the conversion cache,
+.ZN XtCallConverter
+calls the converter and, if it was not registered with cache type
+.ZN XtCacheNone ,
+enters the result into the cache.
+.ZN XtCallConverter
+then returns what the converter returned.
+.LP
+The \fIcache_ref_return\fP field specifies storage allocated by the
+caller in which an opaque value will be stored. If the type converter
+has been registered with the
+.ZN XtCacheRefCount
+modifier and if the value returned in in \fIcache_ref_return\fP is
+non-NULL, then the call should store the \fIcache_ref_return\fP value
+in order to decrement the reference count when the converted value
+is no longer required. The \fIcache_ref_return\fP argument should be
+NULL if the caller is unwilling or unable to store the value.
+.SH "SEE ALSO"
+XtAppReleaseCacheRefs(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtConvertCase.man b/man/XtConvertCase.man
new file mode 100644 (file)
index 0000000..db83837
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtSetKeyTranslator.__libmansuffix__
diff --git a/man/XtCreateApplicationContext.man b/man/XtCreateApplicationContext.man
new file mode 100644 (file)
index 0000000..12c3b43
--- /dev/null
@@ -0,0 +1,175 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtCreate-Application-Context XtDestroy-Application-Context XtWidget-To-Application-Context XtToolkit-Initialize wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtCreateApplicationContext __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtCreateApplicationContext, XtDestroyApplicationContext, XtWidgetToApplicationContext, XtToolkitInitialize \- create, destroy, and obtain an application context
+.SH SYNTAX
+.HP
+XtAppContext XtCreateApplicationContext(void);
+.HP
+void XtDestroyApplicationContext(XtAppContext \fIapp_context\fP);
+.HP
+XtAppContext XtWidgetToApplicationContext(Widget \fIw\fP);
+.HP
+void XtToolkitInitialize(void);
+.SH ARGUMENTS
+.IP \fIapp_context\fP 1i
+Specifies the application context.
+.ds wi that you want the application context for
+.IP \fIw\fP 1i
+Specifies the widget \*(Wi.
+.SH DESCRIPTION
+The
+.ZN XtCreateApplicationContext
+function returns an application context,
+which is an opaque type.
+Every application must have at least one application context.
+.LP
+The
+.ZN XtDestroyApplicationContext
+function destroys the specified application context as soon as it is safe
+to do so.
+If called from with an event dispatch (for example, a callback procedure),
+.ZN XtDestroyApplicationContext
+does not destroy the application context until the dispatch is complete.
+.LP
+The
+.ZN XtWidgetToApplicationContext
+function returns the application context for the specified widget.
+.LP
+The
+.ZN XtToolkitInitialize
+function initializes the Intrinsics internals.
+If
+.ZN XtToolkitInitialize
+was previously called it returns immediately.
+.LP
+.SH "SEE ALSO"
+XtDisplayInitialize(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtCreateApplicationShell.man b/man/XtCreateApplicationShell.man
new file mode 100644 (file)
index 0000000..8e1a55b
--- /dev/null
@@ -0,0 +1,156 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtApp-Create-Application-Shell wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtCreateApplicationShell __libmansuffix__ __xorgversion__ "XT COMPATIBILITY FUNCTIONS"
+.SH NAME
+XtCreateApplicationShell \- create top-level widget instance
+.SH SYNTAX
+.HP
+Widget XtCreateApplicationShell(String \fIname\fP, WidgetClass
+\fIwidget_class\fP, ArgList \fIargs\fP, Cardinal \fInum_args\fP);
+.SH ARGUMENTS
+.IP \fIname\fP 1i
+Specifies the name of the shell.
+.IP \fIargs\fP 1i
+Specifies the argument list to override any other resource specifications.
+.IP \fInum_args\fP 1i
+Specifies the number of arguments in the argument list.
+.SH DESCRIPTION
+The procedure
+.ZN XtCreateApplicationShell
+calls
+.ZN XtAppCreateShell
+with the \fIapplication\fP NULL, the application class passed to
+.ZN XtInitialize ,
+and the default application context created by
+.ZN XtInitialize .
+This routine has been replaced by
+.ZN XtAppCreateShell .
+.SH "SEE ALSO"
+XtAppCreateShell(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtCreateManagedWidget.man b/man/XtCreateManagedWidget.man
new file mode 100644 (file)
index 0000000..e3e83b4
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtCreateWidget.__libmansuffix__
diff --git a/man/XtCreatePopupShell.man b/man/XtCreatePopupShell.man
new file mode 100644 (file)
index 0000000..93c5127
--- /dev/null
@@ -0,0 +1,177 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtCreate-Popup-Shell XtVaCreate-Popup-Shell wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtCreatePopupShell __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtCreatePopupShell, XtVaCreatePopupShell \- create a popup shell
+.SH SYNTAX
+.HP
+Widget XtCreatePopupShell(String \fIname\fP, WidgetClass \fIwidget_class\fP,
+Widget \fIparent\fP, ArgList \fIargs\fP, Cardinal \fInum_args\fP);
+.HP
+Widget XtVaCreatePopupShell(String \fIname\fP, WidgetClass \fIwidget_class\fP,
+Widget \fIparent\fP, ...\^);
+.SH ARGUMENTS
+.ds Al to override the resource defaults
+.IP \fIargs\fP 1i
+Specifies the argument list \*(Al.
+.ds Sh \ shell
+.IP \fIname\fP 1i
+Specifies the text name for the created\*(Sh widget.
+.IP \fInum_args\fP 1i
+Specifies the number of arguments in the argument list.
+.IP \fIparent\fP 1i
+Specifies the parent widget.
+.ds Wc \ pointer for the created shell widget
+.IP \fIwidget_class\fP 1i
+Specifies the widget class\*(Wc.
+.IP \fI...\fP 1i
+Specifies the variable argument list \*(Al.
+.SH DESCRIPTION
+The
+.ZN XtCreatePopupShell
+function ensures that the specified class is a subclass of
+.ZN Shell
+and, rather than using insert_child to attach the widget to the parent's
+.IN "insert_child procedure"
+children list, attaches the shell to the parent's pop-ups list directly.
+.LP
+A spring-loaded pop-up invoked from a translation table already must 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 ``on-the-fly'' 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.
+.SH "SEE ALSO"
+XtCreateWidget(__libmansuffix__),
+XtPopdown(__libmansuffix__),
+XtPopup(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtCreateSelectionRequest.man b/man/XtCreateSelectionRequest.man
new file mode 100644 (file)
index 0000000..f9dfba6
--- /dev/null
@@ -0,0 +1,196 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtCreate-Selection-Request XtSend-Selection-Request XtCancel-Selection-Request wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtCreateSelectionRequest __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtCreateSelectionRequest, XtSendSelectionRequest, XtCancelSelectionRequest \- bundle multiple selection conversion requests into a single request using MULTIPLE target
+.SH SYNTAX
+.HP
+void XtCreateSelectionRequest(Widget \fIrequestor\fP, Atom \fIselection\fP):
+.HP
+void XtSendSelectionRequest(Widget \fIrequestor\fP, Atom \fIselection\fP, Time
+\fItime\fP);
+.HP
+void XtCancelSelectionRequest(Widget \fIrequestor\fP, Atom \fIselection\fP);
+.SH ARGUMENTS
+.IP \fIrequestor\fP 1i
+Specifies the widget making the request. Must be of class Core or a
+subclass thereof.
+.IP \fIselection\fP 1i
+Specifies the particular selection desired.
+.IP \fItime\fP 1i
+Specifies the timestamp to be used in making the request.
+.SH DESCRIPTION
+When
+.ZN XtCreateSelectionRequest
+is called, subsequent calls to
+.ZN XtGetSelectionValue
+and
+.ZN XtGetSelectionValueIncremental
+with the requestor and selection as specified to
+.ZN XtCreateSelectionRequest
+will be bundled into a single selection conversion request with
+multiple targets. The request is actually initiated by calling
+.ZN XtSendSelectionRequest .
+.LP
+When
+.ZN XtSendSelectionRequest
+is called with a value of \fIrequestor\fP and \fIselection\fP matching
+a previous call to
+.ZN XtCreateSelectionRequest ,
+a selection conversion request is actually 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 the
+target MULTIPLE using the specified timestamp. As the conversions are
+made, the callbacks associated with each
+.ZN XtGetSelectionValue
+and
+.ZN XtGetSelectionValueIncremental
+are invoked in turn.
+.LP
+Multi-threaded applications should lock the application context before
+calling
+.ZN XtCreateSelectionRequest
+and release the lock after calling
+.ZN XtSendSelectionRequest
+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.
+.LP
+When
+.ZN XtCancelSelectionRequest
+is called, any requests queued since the last call to
+.ZN XtCreateSelectionRequest
+are cleaned up. Subsequent calls to
+.ZN XtGetSelectionValue ,
+.ZN XtGetSelectionValues ,
+.ZN XtGetSelectionValueIncremental ,
+and
+.ZN XtGetSelectionValuesIncremental
+will not be deferred.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtCreateWidget.man b/man/XtCreateWidget.man
new file mode 100644 (file)
index 0000000..cb8ac43
--- /dev/null
@@ -0,0 +1,308 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtCreate-Widget XtCreate-Managed-Widget XtDestroy-Widget XtVa-Create-Widget XtVa-Create-Managed-Widget wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtCreateWidget __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtCreateWidget, XtVaCreateWidget, XtCreateManagedWidget, XtVaCreateManagedWidget, XtDestroyWidget \- create and destroy widgets
+.SH SYNTAX
+.HP
+Widget XtCreateWidget(String \fIname\fP, WidgetClass \fIwidget_class\fP,
+Widget \fIparent\fP, ArgList \fIargs\fP, Cardinal \fInum_args\fP);
+.HP
+Widget XtVaCreateWidget(String \fIname\fP, WidgetClass \fIwidget_class\fP,
+Widget \fIparent\fP, ...\^);
+.HP
+Widget XtCreateManagedWidget(String \fIname\fP, WidgetClass
+\fIwidget_class\fP, Widget \fIparent\fP, ArgList \fIargs\fP, Cardinal
+\fInum_args\fP);
+.HP
+Widget XtVaCreateManagedWidget(String \fIname\fP, WidgetClass
+\fIwidget_class\fP, Widget \fIparent\fP, ...\^);
+.HP
+void XtDestroyWidget(Widget \fIw\fP);
+.SH ARGUMENTS
+.ds Al to override the resource defaults
+.IP \fIargs\fP 1i
+Specifies the argument list \*(Al.
+.IP \fIname\fP 1i
+Specifies the resource 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 same parent.
+.IP \fInum_args\fP 1i
+Specifies the number of arguments in the argument list.
+.IP \fIparent\fP 1i
+Specifies the parent widget.
+.IP \fIw\fP 1i
+Specifies the widget.
+.ds Wc \ pointer for the created widget
+.IP \fIwidget_class\fP 1i
+Specifies the widget class\*(Wc.
+.IP \fI...\fP
+Specifies the variable argument list \*(Al.
+.SH DESCRIPTION
+The
+.ZN XtCreateWidget
+function performs much of the boilerplate operations of widget creation:
+.IP \(bu 5
+Checks to see if the class_initialize procedure has been called for this class
+and for all superclasses and, if not, calls those necessary in a
+superclass-to-subclass order.
+.IP \(bu 5
+Allocates memory for the widget instance.
+.IP \(bu 5
+If the parent is a subclass of
+.ZN constraintWidgetClass ,
+it allocates memory for the parent's constraints
+and stores the address of this memory into the constraints field.
+.IP \(bu 5
+Initializes the core nonresource data fields
+(for example, parent and visible).
+.IP \(bu 5
+Initializes the resource fields (for example, background_pixel)
+by using the resource lists specified for this class and all superclasses.
+.IP \(bu 5
+If the parent is a subclass of
+.ZN constraintWidgetClass ,
+it initializes the resource fields of the constraints record
+by using the constraint resource list specified for the parent's class
+and all superclasses up to
+.ZN constraintWidgetClass .
+.IP \(bu 5
+Calls the initialize procedures for the widget by starting at the
+.ZN Core
+initialize procedure on down to the widget's initialize procedure.
+.IP \(bu 5
+If the parent is a subclass of
+.ZN compositeWidgetClass ,
+it puts the widget into its parent's children list by calling its parent's
+insert_child procedure.
+For further information,
+see Section 3.5.
+.IP \(bu 5
+If the parent is a subclass of
+.ZN constraintWidgetClass ,
+it calls the constraint initialize procedures,
+starting at
+.ZN constraintWidgetClass
+on down to the parent's constraint initialize procedure.
+.LP
+Note that you can determine the number of arguments in an argument list
+by using the
+.ZN  XtNumber
+macro.
+For further information, see Section 11.1.
+.LP
+The
+.ZN XtCreateManagedWidget
+function is a convenience routine that calls
+.ZN XtCreateWidget
+and
+.ZN XtManageChild .
+.LP
+The
+.ZN XtDestroyWidget
+function provides the only method of destroying a widget,
+including widgets that need to destroy themselves.
+It can be called at any time,
+including from an application callback routine of the widget being destroyed.
+This requires a two-phase destroy process in order to avoid dangling
+references to destroyed widgets.
+.LP
+In phase one,
+.ZN XtDestroyWidget
+performs the following:
+.IP \(bu 5
+If the being_destroyed field of the widget is
+.ZN True ,
+it returns immediately.
+.IP \(bu 5
+Recursively descends the widget tree and
+sets the being_destroyed field to
+.ZN True
+for the widget and all children.
+.IP \(bu 5
+Adds the widget to a list of widgets (the destroy list) that should be
+destroyed when it is safe to do so.
+.LP
+Entries on the destroy list satisfy the invariant that
+if w2 occurs after w1 on the destroy list then w2 is not a descendent of w1.
+(A descendant refers to both normal and pop-up children.)
+.LP
+Phase two 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
+.ZN XtDispatchEvent
+is about to return or immediately if not in
+.ZN XtDispatchEvent .
+.LP
+In phase two,
+.ZN XtDestroyWidget
+performs the following on each entry in the destroy list:
+.IP \(bu 5
+Calls the destroy callback procedures registered on the widget
+(and all descendants) in post-order (it calls children callbacks
+before parent callbacks).
+.IP \(bu 5
+If the widget's parent is a subclass of
+.ZN compositeWidgetClass
+and if the parent is not being destroyed,
+it calls
+.ZN XtUnmanageChild
+on the widget and then calls the widget's parent's delete_child procedure
+(see Section 3.4).
+.IP \(bu 5
+If the widget's parent is a subclass of
+.ZN constraintWidgetClass ,
+it calls the constraint destroy procedure for the parent,
+then the parent's superclass,
+until finally it calls the constraint destroy procedure for
+.ZN constraintWidgetClass .
+.IP \(bu 5
+Calls the destroy methods for the widget (and all descendants)
+in post-order.
+For each such widget,
+it calls the 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 Core
+class record.
+.IP \(bu 5
+Calls
+.ZN XDestroyWindow
+if the widget is realized (that is, has an X window).
+The server recursively destroys all descendant windows.
+.IP \(bu 5
+Recursively descends the tree and deallocates all pop-up widgets, constraint
+records, callback lists and, if the widget is a subclass of
+.ZN compositeWidgetClass ,
+children.
+.SH "SEE ALSO"
+XtAppCreateShell(__libmansuffix__),
+XtCreatePopupShell(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtCreateWindow.man b/man/XtCreateWindow.man
new file mode 100644 (file)
index 0000000..a350c84
--- /dev/null
@@ -0,0 +1,186 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtCreate-Window wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtCreateWindow __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtCreateWindow \- window creation convenience function
+.SH SYNTAX
+.HP
+void XtCreateWindow(Widget \fIw\fP, unsigned int \fIwindow_class\fP, Visual
+*\fIvisual\fP, XtValueMask \fIvalue_mask\fP, XSetWindowAttributes
+*\fIattributes\fP);
+.SH ARGUMENTS
+.IP \fIattributes\fP 1i
+Specifies the window attributes to use in the
+.ZN XCreateWindow
+call.
+.ds Vm attribute fields to use
+.IP \fIvalue_mask\fP 1i
+Specifies which \*(Vm.
+.IP \fIvisual\fP 1i
+Specifies the visual type (usually
+.ZN CopyFromParent ).
+.ds Wi that is used to set the x,y coordinates and so on
+.IP \fIw\fP 1i
+Specifies the widget \*(Wi.
+.IP \fIwindow_class\fP 1i
+Specifies the Xlib window class (for example,
+.ZN InputOutput ,
+.ZN InputOnly ,
+or
+.ZN CopyFromParent ).
+.SH DESCRIPTION
+The
+.ZN XtCreateWindow
+function calls the Xlib
+.ZN XCreateWindow
+function with values from the widget structure and the passed parameters.
+Then, it assigns the created window to the widget's window field.
+.LP
+.ZN XtCreateWindow
+evaluates the following fields of the
+.ZN Core
+widget structure:
+.IP \(bu 5
+depth
+.IP \(bu 5
+screen
+.IP \(bu 5
+parent -> core.window
+.IP \(bu 5
+x
+.IP \(bu 5
+y
+.IP \(bu 5
+width
+.IP \(bu 5
+height
+.IP \(bu 5
+border_width
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtDatabase.man b/man/XtDatabase.man
new file mode 100644 (file)
index 0000000..0a0994c
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtDisplayInitialize.__libmansuffix__
diff --git a/man/XtDestroyApplicationContext.man b/man/XtDestroyApplicationContext.man
new file mode 100644 (file)
index 0000000..ae5d5b5
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtCreateApplicationContext.__libmansuffix__
diff --git a/man/XtDestroyWidget.man b/man/XtDestroyWidget.man
new file mode 100644 (file)
index 0000000..e3e83b4
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtCreateWidget.__libmansuffix__
diff --git a/man/XtDirectConvert.man b/man/XtDirectConvert.man
new file mode 100644 (file)
index 0000000..517ae3e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtConvert.__libmansuffix__
diff --git a/man/XtDisownSelection.man b/man/XtDisownSelection.man
new file mode 100644 (file)
index 0000000..bda68eb
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtOwnSelection.__libmansuffix__
diff --git a/man/XtDispatchEvent.man b/man/XtDispatchEvent.man
new file mode 100644 (file)
index 0000000..89b2e7b
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAppNextEvent.__libmansuffix__
diff --git a/man/XtDispatchEventToWidget.man b/man/XtDispatchEventToWidget.man
new file mode 100644 (file)
index 0000000..3a421f7
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtInsertEventTypeHandler.__libmansuffix__
diff --git a/man/XtDisplay.man b/man/XtDisplay.man
new file mode 100644 (file)
index 0000000..c6f3bc7
--- /dev/null
@@ -0,0 +1,169 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtDisplay-Of-Object XtScreen-Of-Object XtWindow-Of-Object wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtDisplay __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtDisplay, XtDisplayOfObject, XtScreen, XtScreenOfObject, XtWindow, XtWindowOfObject \- obtain window information about a widget
+.SH SYNTAX
+.HP
+Display *XtDisplay(Widget \fIw\fP);
+.HP
+Display *XtDisplayOfObject(Widget \fIobject\fP);
+.HP
+Screen *XtScreen(Widget \fIw\fP);
+.HP
+Screen *XtScreenOfObject(Widget \fIobject\fP);
+.HP
+Window XtWindow(Widget \fIw\fP);
+.HP
+Window XtWindowOfObject(Widget \fIobject\fP);
+.SH ARGUMENTS
+.IP \fIw\fP 1i
+Specifies the widget.
+.LP
+.IP \fIobject\fP 1i
+Specifies the widget.
+.SH DESCRIPTION
+.ZN XtDisplay
+returns the display pointer for the specified widget.
+.LP
+.ZN XtDisplayOfObject
+returns the display pointer for the specified object.
+.LP
+.ZN XtScreen
+returns the screen pointer for the specified widget.
+.LP
+.ZN XtScreenOfObject
+returns the screen pointer for the specified object.
+.LP
+.ZN XtWindow
+returns the window of the specified widget.
+.LP
+.ZN XtWindowOfObject
+returns the window of the specified object.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtDisplayInitialize.man b/man/XtDisplayInitialize.man
new file mode 100644 (file)
index 0000000..d5b6be4
--- /dev/null
@@ -0,0 +1,267 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtDisplay-Initialize XtOpen-Display XtClose-Display XtDatabase XtScreen-Database wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtDisplayInitialize __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtDisplayInitialize, XtOpenDisplay, XtDatabase, XtScreenDatabase, XtCloseDisplay \- initialize, open, or close a display
+.SH SYNTAX
+.HP
+void XtDisplayInitialize(XtAppContext \fIapp_context\fP, Display
+*\fIdisplay\fP, String \fIapplication_name\fP, String \fIapplication_class\fP,
+XrmOptionDescRec *\fIoptions\fP, Cardinal \fInum_options\fP, int *\fIargc\fP,
+String *\fIargv\fP);
+.HP
+Display *XtOpenDisplay(XtAppContext \fIapp_context\fP, String
+\fIdisplay_string\fP, String \fIapplication_name\fP, String
+\fIapplication_class\fP, XrmOptionDescRec *\fIoptions\fP, Cardinal
+\fInum_options\fP, int *\fIargc\fP, String *\fIargv\fP);
+.HP
+void XtCloseDisplay(Display *\fIdisplay\fP);
+.HP
+XrmDatabase XtDatabase(Display *\fIdisplay\fP);
+.HP
+XrmDatabase XtScreenDatabase(Screen* \fIscreen\fP);
+.SH ARGUMENTS
+.IP \fIargc\fP 1i
+Specifies a pointer to the number of command line parameters.
+.IP \fIargv\fP 1i
+Specifies the command line parameters.
+.IP \fIapp_context\fP 1i
+Specifies the application context.
+.ds Ac , which usually is the generic name for all instances of this application
+.IP \fIapplication_class\fP 1i
+Specifies the class name of this application\*(Ac.
+.IP \fIapplication_name\fP 1i
+Specifies the name of the application instance.
+.IP \fIdisplay\fP 1i
+Specifies the display\*(Di.
+Note that a display can be in at most one application context.
+.IP \fInum_options\fP 1i
+Specifies the number of entries in the options list.
+.IP \fIoptions\fP 1i
+Specifies how to parse the command line for any application-specific resources.
+The options argument is passed as a parameter to
+.ZN XrmParseCommand .
+For further information,
+see \fI\*(xL\fP.
+.IP \fIscreen\fP 1i
+Specifies the screen whose resource database is to be returned.
+.SH DESCRIPTION
+The
+.ZN XtDisplayInitialize
+function builds the resource database, calls the Xlib
+.ZN XrmParseCommand
+function to parse the command line,
+and performs other per display initialization.
+After
+.ZN XrmParseCommand
+has been called,
+argc and argv contain only those parameters that
+were not in the standard option table or in the table specified by the
+options argument.
+If the modified argc is not zero,
+most applications simply print out the modified argv along with a message
+listing the allowable options.
+On UNIX-based systems,
+the application name is usually the final component of argv[0].
+If the synchronize resource is
+.ZN True
+for the specified application,
+.ZN XtDisplayInitialize
+calls the Xlib
+.ZN XSynchronize
+function to put Xlib into synchronous mode for this display connection.
+If the reverseVideo resource is
+.ZN True ,
+the \*(xI exchange
+.ZN XtDefaultForeground
+and
+.ZN XtDefaultBackground
+for widgets created on this display.
+(See Section 9.6.1).
+.LP
+The
+.ZN XtOpenDisplay
+function calls
+.ZN XOpenDisplay
+the specified display name.
+If display_string is NULL,
+.ZN XtOpenDisplay
+uses the current value of the \-display option specified in argv
+and if no display is specified in argv,
+uses the user's default display (on UNIX-based systems,
+this is the value of the DISPLAY environment variable).
+.LP
+If this succeeds, it then calls
+.ZN XtDisplayInitialize
+and pass it the opened display and
+the value of the \-name option specified in argv as the application name.
+If no name option is specified,
+it uses the application name passed to
+.ZN XtOpenDisplay .
+If the application name is NULL,
+it uses the last component of argv[0].
+.ZN XtOpenDisplay
+returns the newly opened display or NULL if it failed.
+.LP
+.ZN XtOpenDisplay
+is provided as a convenience to the application programmer.
+.LP
+The
+.ZN XtCloseDisplay
+function closes the specified display as soon as it is safe to do so.
+If called from within an event dispatch (for example, a callback procedure),
+.ZN XtCloseDisplay
+does not close the display until the dispatch is complete.
+Note that applications need only call
+.ZN XtCloseDisplay
+if they are to continue executing after closing the display;
+otherwise, they should call
+.ZN XtDestroyApplicationContext
+or just exit.
+.LP
+The
+.ZN XtDatabase
+function returns the fully merged resource database that was built by
+.ZN XtDisplayInitialize
+associated with the display that was passed in.
+If this display has not been initialized by
+.ZN XtDisplayInitialize ,
+the results are not defined.
+.LP
+The
+.ZN XtScreenDatabase
+function returns the fully merged resource database associated with the
+specified screen. If the \fIscreen\fP does not belong to a
+.ZN Display
+initialized by
+.ZN XtDisplayInitialize ,
+the results are undefined.
+.SH "SEE ALSO"
+XtAppCreateShell(__libmansuffix__),
+XtCreateApplicationContext(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtDisplayOfObject.man b/man/XtDisplayOfObject.man
new file mode 100644 (file)
index 0000000..b9e795c
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtDisplay.__libmansuffix__
diff --git a/man/XtDisplayStringConversionWarning.man b/man/XtDisplayStringConversionWarning.man
new file mode 100644 (file)
index 0000000..5335d99
--- /dev/null
@@ -0,0 +1,159 @@
+.\" Copyright (c) 1993, 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 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 dealing in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtDisplay-String-Conversion-Warning wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtDisplayStringConversionWarning __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtDisplayStringConversionWarning \- issue a conversion warning message
+.SH SYNTAX
+.HP
+void XtDisplayStringConversionWarning(Display* \fIdisplay\fP, String
+\fIfrom_value\fP, \fIto_type\fP);
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the display connection with which the conversion is associated.
+.IP \fIfrom_value\fP 1i
+Specifies the string that could not be converted.
+.IP \fIto_type\fP 1i
+Specifies the target representation type requested.
+.SH DESCRIPTION
+The
+.ZN XtDisplayStringConversionWarning
+function issues a warning message using
+.ZN XtAppWarningMsg
+with name ``conversionError'', type ``string'', class ``XtToolkitError,
+and the default message string ``Cannot convert "\fIfrom_value\fP" to
+type \fIto_type\fP''.
+.LP
+To issue other types of warning or error messages, the type converter
+should use
+.ZN XtAppWarningMsg
+or
+.ZN XtAppErrorMsg .
+.SH "SEE ALSO"
+XtAppWarningMsg(3t)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtDisplayToApplicationContext.man b/man/XtDisplayToApplicationContext.man
new file mode 100644 (file)
index 0000000..78b86cc
--- /dev/null
@@ -0,0 +1,142 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtDisplay-To-Application-Context wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtDisplayToApplicationContext __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtDisplayToApplicationContext \- obtain an application context
+.SH SYNTAX
+.HP
+XtAppContext XtDisplayToApplicationContext(Display* \fIdpy\fP);
+.SH ARGUMENTS
+.ds Wi that you want the application context for
+.IP \fIdpy\fP 1i
+Specifies the display \*(Wi.
+.SH DESCRIPTION
+The
+.ZN XtDisplayToApplicationContext
+function returns the application context for the specified display.
+.SH "SEE ALSO"
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtError.man b/man/XtError.man
new file mode 100644 (file)
index 0000000..e1feebf
--- /dev/null
@@ -0,0 +1,172 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtError XtSet-Error-Handler XtSet-Warning-Handler XtWarning wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtError __libmansuffix__ __xorgversion__ "XT COMPATIBILITY FUNCTIONS"
+.SH NAME
+XtError, XtSetErrorHandler, XtSetWarningHandler, XtWarning \- low-level error handlers
+.SH SYNTAX
+.HP
+void XtError(String \fImessage\fP);
+.HP
+void XtSetErrorHandler(XtErrorHandler \fIhandler\fP):
+.HP
+void XtSetWarningHandler(XtErrorHandler \fIhandler\fP);
+.HP
+void XtWarning(String \fImessage\fP);
+.SH ARGUMENTS
+.IP \fImessage\fP 1i
+Specifies the nonfatal error message that is to be reported.
+.ds Ha fatal error procedure, which should not return, \
+or the nonfatal error procedure, which usually returns
+.IP \fIhandler\fP 1i
+Specifies the new \*(Ha.
+.ds Me reported
+.IP \fImessage\fP 1i
+Specifies the message that is to be \*(Me.
+.SH DESCRIPTION
+The
+.ZN XtError
+function has been superceded by
+.ZN XtAppError .
+.LP
+The
+.ZN XtSetErrorHandler
+function has been superceded by
+.ZN XtAppSetErrorHandler .
+.LP
+The
+.ZN XtSetWarningHandler
+function has been superceded by
+.ZN XtAppSetWarningHandler .
+.LP
+The
+.ZN XtWarning
+function has been superceded by
+.ZN XtAppWarning .
+.SH "SEE ALSO"
+.BR XtAppError (__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtErrorMsg.man b/man/XtErrorMsg.man
new file mode 100644 (file)
index 0000000..b16f3e2
--- /dev/null
@@ -0,0 +1,182 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtError-Msg XtSet-Error-Msg-Handler XtSet-Warning-Msg-Handler XtWarning-Msg wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtErrorMsg __libmansuffix__ __xorgversion__ "XT COMPATIBILITY FUNCTIONS"
+.SH NAME
+XtErrorMsg, XtSetErrorMsgHandler, XtWarningMsg, XtSetWarningMsgHandler \- high-level error handlers
+.SH SYNTAX
+.HP
+void XtErrorMsg(String \fIname\fP, String \fItype\fP, String \fIclass\fP,
+String \fIdefault\fP, String *\fIparams\fP, Cardinal *\fInum_params\fP);
+.HP
+void XtSetErrorMsgHandler(XtErrorMsgHandler \fImsg_handler\fP);
+.HP
+void XtSetWarningMsgHandler(XtErrorMsgHandler \fImsg_handler\fP);
+.HP
+void XtWarningMsg(String \fIname\fP, String \fItype\fP, String \fIclass\fP,
+String \fIdefault\fP, String *\fIparams\fP, Cardinal *\fInum_params\fP);
+.SH ARGUMENTS
+.ds Cl
+.IP \fIclass\fP 1i
+Specifies the resource class\*(Cl.
+.IP \fIdefault\fP 1i
+Specifies the default message to use\*(Dm.
+.IP \fIname\fP 1i
+Specifies the general kind of error.
+.IP \fItype\fP 1i
+Specifies the detailed name of the error.
+.ds Mh fatal error procedure, which should not return \
+or the nonfatal error procedure, which usually returns
+.IP \fImsg_handler\fP 1i
+Specifies the new \*(Mh.
+.IP \fInum_params\fP 1i
+Specifies the number of values in the parameter list.
+.IP \fIparams\fP 1i
+Specifies a pointer to a list of values to be stored in the message.
+.SH DESCRIPTION
+The
+.ZN XtErrorMsg
+function has been superceded by
+.ZN XtAppErrorMsg .
+.LP
+The
+.ZN XtSetErrorMsgHandler
+function has been superceded by
+.ZN XtAppSetErrorMsgHandler .
+.LP
+The
+.ZN XtSetWarningMsgHandler
+function has been superceded by
+.ZN XtAppSetWarningMsgHandler .
+.LP
+The
+.ZN XtWarningMsg
+function has been superceded by
+.ZN XtAppWarningMsg
+.SH "SEE ALSO"
+.BR XtAppErrorMsg (__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtFindFile.man b/man/XtFindFile.man
new file mode 100644 (file)
index 0000000..4c516b7
--- /dev/null
@@ -0,0 +1,187 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtFind-File wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtFindFile __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtFindFile \- search for a file using substitutions in the path list
+.SH SYNTAX
+.HP
+String XtFindFile(String \fIpath\fP, Substitution \fIsubstitutions\fP,
+Cardinal \fInum_substitutions\fP, XtFilePredicate \fIpredicate\fP);
+.SH ARGUMENTS
+.IP \fIpath\fP 1i
+Specifies a path of file names, including substitution characters.
+.IP \fIsubstitutions\fP 1i
+Specifies a list of substitutions to make into a path.
+.IP \fInum_substitutions\fP 1i
+Specifies the number of substitutions passed in.
+.IP \fIpredicate\fP 1i
+Specifies a procedure to call to judge a potential file name, or NULL.
+.SH DESCRIPTION
+The \fIpath\fP 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,
+.ZN XtFindFile
+looks through the
+specified \fIsubstitutions\fP for that character in the \fImatch\fP field and if
+found replaces the percent and match characters with the string in the
+corresponding \fIsubstitution\fP field.  A \fIsubstitution\fP 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,
+.ZN XtFindFile
+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
+.ZN XtFindFile
+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
+.ZN True ;
+this string is the return value for
+.ZN XtFindFile .
+If no string yields a
+.ZN True
+return from the predicate,
+.ZN XtFindFile
+returns NULL.
+.LP
+If the \fIpredicate\fP parameter is NULL, an internal procedure that checks
+if the file exists, is readable, and is not a directory will be used.
+.LP
+It is the responsibility of the caller to free the returned string using
+.ZN XtFree
+when it is no longer needed.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtFree.man b/man/XtFree.man
new file mode 100644 (file)
index 0000000..50eaf76
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtMalloc.__libmansuffix__
diff --git a/man/XtGetActionKeysym.man b/man/XtGetActionKeysym.man
new file mode 100644 (file)
index 0000000..3e6b77c
--- /dev/null
@@ -0,0 +1,168 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtGet-Action-Keysym wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtGetActionKeysym __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtGetActionKeysym \- obtain corresponding keysym
+.SH SYNTAX
+.HP
+KeySym XtGetActionKeysym(XEvent* \fIevent\fP, Modifiers*
+\fImodifiers_return\fP);
+.SH ARGUMENTS
+.IP \fIevent\fP 1i
+Specifies the event pointer passed to the action procedure by the
+Intrinsics.
+.IP \fImodifiers_return\fP 1i
+Returns the modifiers that caused the match, if non-NULL.
+.SH DESCRIPTION
+If
+.ZN XtGetActionKeysym
+is called after an action procedure has been invoked by the Intrinsics
+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
+.ZN KeyPress
+or
+.ZN KeyRelease
+event, then
+.ZN XtGetActionKeysym
+returns the KeySym that matched the final event specification in the
+translation table and, if \fImodifiers_return\fP is non-NULL, the
+modifier state actually used to generate this KeySym; otherwise, if
+the event is a
+.ZN KeyPress
+or
+.ZN KeyRelease
+event, then
+.ZN XtGetActionKeysym
+calls
+.ZN XtTranslateKeycode
+and returns the results; else it returns
+.ZN NoSymbol
+and does not examine \fImodifiers_return\fP.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtGetActionList.man b/man/XtGetActionList.man
new file mode 100644 (file)
index 0000000..e677080
--- /dev/null
@@ -0,0 +1,155 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtGet-Action-List wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtGetActionList __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtGetActionList \- obtain class action list
+.SH SYNTAX
+.HP
+void XtGetActionList(WidgetClass \fIwidget_class\fP, XtActionList*
+\fIactions_return\fP, Cardinal* \fInum_actions_return\fP);
+.SH ARGUMENTS
+.IP \fIwidget_class\fP 1i
+Specifies the widget class whose actions are to be returned.
+.IP \fIactions_return\fP 1i
+Returns the action list.
+.IP \fInum_actions_return\fP 1i
+Returns the number of action procedures declared by the class.
+.SH DESCRIPTION
+.ZN XtGetActionList
+returns the action table defined by the specified widget class. This
+table does not include actions defined by the superclasses. If
+\fIwidget_class\fP is not initialized, or is not
+.ZN coreWidgetClass
+or a subclass thereof, or if the class does not define any actions,
+*\fIactions_return\fP will be NULL and *\fInum_actions_return\fP will
+be zero. If *\fIactions_return\fP is non-NULL the client is responsible
+for freeing the table using
+.ZN XtFree
+when it is no longer needed.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtGetApplicationNameAndClass.man b/man/XtGetApplicationNameAndClass.man
new file mode 100644 (file)
index 0000000..c2c1dc1
--- /dev/null
@@ -0,0 +1,153 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtGet-Application-Name-And-Class wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtGetApplicationNameAndClass __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtGetApplicationNameAndClass \- retrieve application name and class
+.SH SYNTAX
+.HP
+void XtGetApplicationNameAndClass(Display* \fIdisplay\fP, String*
+\fIname_return\fP, String* \fIclass_return\fP);
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies an open display connection that has been initialized with
+.ZN XtDisplayInitialize .
+.IP \fIname_return\fP 1i
+Returns the application name.
+.IP \fIclass_return\fP 1i
+Returns the application class.
+.SH DESCRIPTION
+.ZN XtGetApplicationNameAndClass
+returns the application name and class passed to
+.ZN XtDisplayInitialize
+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 Intrinsics and must not be modified or freed by the
+caller.
+.SH "SEE ALSO"
+.BR XtDisplayInitialize (__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtGetApplicationResources.man b/man/XtGetApplicationResources.man
new file mode 100644 (file)
index 0000000..b97a001
--- /dev/null
@@ -0,0 +1,179 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtGet-Application-Resources, XtVa-Get-Application-Resources wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtGetApplicationResources __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtGetApplicationResources, XtVaGetApplicationResources \- obtain application resources
+.SH SYNTAX
+.HP
+void XtGetApplicationResources(Widget \fIw\fP, XtPointer \fIbase\fP,
+XtResourceList \fIresources\fP, Cardinal \fInum_resources\fP, ArgList
+\fIargs\fP, Cardinal \fInum_args\fP);
+.HP
+void XtVaGetApplicationResources(Widget \fIw\fP, XtPointer \fIbase\fP,
+XtResourceList \fIresources\fP, Cardinal \fInum_resources\fP, ...\^);
+.SH ARGUMENTS
+.ds Al to override resources obtained from the resource database
+.IP \fIargs\fP 1i
+Specifies the argument list \*(Al.
+.ds Ba written
+.IP \fIbase\fP 1i
+Specifies the base address of the subpart data structure where the resources
+should be \*(Ba.
+.IP \fInum_args\fP 1i
+Specifies the number of arguments in the argument list.
+.IP \fInum_resources\fP 1i
+Specifies the number of resources in the resource list.
+.IP \fIresources\fP 1i
+Specifies the resource list for the subpart.
+.ds Wi that wants resources for a subpart \
+or that identifies the resource database to search
+.IP \fIw\fP 1i
+Specifies the widget \*(Wi.
+.IP \fI...\fP 1i
+Specifies the variable arguments \*(Al.
+.SH DESCRIPTION
+The
+.ZN XtGetApplicationResources
+function first uses the passed widget,
+which is usually an application shell,
+to construct a resource name and class list,
+Then, it retrieves the resources from the argument list,
+the resource database, or the resource list default values.
+After adding base to each address,
+.ZN XtGetApplicationResources
+copies the resources into the address given in the resource list.
+If args is NULL,
+num_args must be zero.
+However, if num_args 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 base argument.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtGetClassExtension.man b/man/XtGetClassExtension.man
new file mode 100644 (file)
index 0000000..8026e56
--- /dev/null
@@ -0,0 +1,162 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtGet-Class-Extension wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtGetClassExtension __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtGetClassExtension \- locate a class extension record
+.SH SYNTAX
+.HP
+XtPointer XtGetClassExtension(WidgetClass \fIobject_class\fP, Cardinal
+\fIbyte_offset\fP, XrmQuark \fItype\fP, long \fIversion\fP, Cardinal
+\fIrecord_size\fP);
+.SH ARGUMENTS
+.IP \fIobject_class\fP 1i
+Specifies the widget class containing the extension list to be searched.
+.IP \fIbyte_offset\fP 1i
+Specifies the offset in bytes form the base of the widget class of the
+extension field to be searched.
+.IP \fItype\fP 1i
+Specifies the name of the class extension to be located.
+.IP \fIversion\fP 1i
+Specifies the minimum acceptable version of the class extension
+required for a match.
+.IP \fIrecord_size\fP 1i
+Specifies the minimum acceptable length of the class extension record
+required for match, or 0.
+.SH DESCRIPTION
+The list of extension records at the specified offset in the specified
+\fIwidget_class\fP will be searched for a match on the specified
+\fItype\fP, a version greater than or equal to the specified \fIversion\fP,
+and a record size greater than or equal the specified \fIrecord_size\fP
+if it is nonzero.
+.ZN XtGetClassExtension
+returns a pointer to a matching extension record or NULL if no match
+is found. The returned extension record is owned by the widget class
+and must not be modified or freed by the caller, except possibly to
+be modified by the widget class owner.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtGetConstraintResourceList.man b/man/XtGetConstraintResourceList.man
new file mode 100644 (file)
index 0000000..c5e4aeb
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtGetResourceList.__libmansuffix__
diff --git a/man/XtGetDisplays.man b/man/XtGetDisplays.man
new file mode 100644 (file)
index 0000000..b478cd7
--- /dev/null
@@ -0,0 +1,147 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtGet-Displays wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtGetDisplays __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtGetDisplays \- retrieve a list of displays associated with an application context
+.SH SYNTAX
+.HP
+void XtGetDisplays(XtAppContext \fIapp_context\fP, Display
+***\fIdpy_return\fP, Cardinal* \fInum_dpy_return\fP);
+.SH ARGUMENTS
+.IP \fIapp_context\fP 1i
+Specifies the application context.
+.IP \fIdpy_return\fP 1i
+Returns a list of open X display connections in the specified application
+context.
+.IP \fInum_dpy_return\fP 1i
+Returns the count of open X display connections in \fIdpy_return\fP.
+.SH DESCRIPTION
+To free the list of displays, use
+.ZN XtFree .
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtGetErrorDatabase.man b/man/XtGetErrorDatabase.man
new file mode 100644 (file)
index 0000000..5198581
--- /dev/null
@@ -0,0 +1,168 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtGet-Error-Database XtGet-Error-Database-Text wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtGetErrorDatabase __libmansuffix__ __xorgversion__ "XT COMPATIBILITY FUNCTIONS"
+.SH NAME
+XtGetErrorDatabase, XtGetErrorDatabaseText \- obtain error database
+.SH SYNTAX
+.HP
+XrmDatabase *XtGetErrorDatabase(void);
+.HP
+void XtGetErrorDatabaseText(char *\fIname\fP, char *\fItype\fP, char
+*\fIclass\fP, char *\fIdefault\fP, char *\fIbuffer_return\fP, int
+\fInbytes\fP);
+.SH ARGUMENTS
+.IP \fIbuffer_return\fP 1i
+Specifies the buffer into which the error message is to be returned.
+.ds Cl \ of the error message
+.IP \fIclass\fP 1i
+Specifies the resource class\*(Cl.
+.IP \fIdefault\fP 1i
+Specifies the default message to use\*(Dm.
+.IP \fIname\fP 1i
+.br
+.ns
+.IP \fItype\fP 1i
+Specifies the name and type that are concatenated to form the resource name
+of the error message.
+.IP \fInbytes\fP 1i
+Specifies the size of the buffer in bytes.
+.SH DESCRIPTION
+The
+.ZN XtGetErrorDatabase
+function has been superceded by
+.ZN XtAppGetErrorDatabase .
+.LP
+The
+.ZN XtGetErrorDatabaseText
+function has been superceded by
+.ZN XtAppGetErrorDatabaseText .
+.SH "SEE ALSO"
+.BR XtAppGetErrorDatabase (__libmansuffix__)
+.BR XtAppGetErrorDatabaseText (__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtGetErrorDatabaseText.man b/man/XtGetErrorDatabaseText.man
new file mode 100644 (file)
index 0000000..35025af
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtGetErrorDatabase.__libmansuffix__
diff --git a/man/XtGetGC.man b/man/XtGetGC.man
new file mode 100644 (file)
index 0000000..63f83ff
--- /dev/null
@@ -0,0 +1,172 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtGet-GC XtRelease-GC wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtGetGC __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtGetGC, XtReleaseGC \- obtain and destroy a sharable GC
+.SH SYNTAX
+.HP
+GC XtGetGC(Widget \fIw\fP, XtGCMask \fIvalue_mask\fP, XGCValues
+*\fIvalues\fP);
+.HP
+void XtReleaseGC(Widget \fIw\fP, GC \fIgc\fP);
+.SH ARGUMENTS
+.IP \fIgc\fP 1i
+Specifies the GC to be deallocated.
+.IP \fIvalues\fP 1i
+Specifies the actual values for this GC.
+.ds Vm fields of the values are specified
+.IP \fIvalue_mask\fP 1i
+Specifies which \*(Vm.
+.IP \fIw\fP 1i
+Specifies the widget.
+.SH DESCRIPTION
+The
+.ZN XtGetGC
+function returns a sharable, read-only GC.
+The parameters to this function are the same as those for
+.ZN XCreateGC
+except that a widget is passed instead of a display.
+.ZN XtGetGC
+shares only GCs in which all values in the GC returned by
+.ZN XCreateGC
+are the same.
+In particular, it does not use the value_mask provided to
+determine which fields of the GC a widget considers relevant.
+The value_mask is used only to tell the server which fields should be
+filled in with widget data and which it should fill in with default values.
+For further information about value_mask and values,
+see
+.ZN XCreateGC
+in the \fI\*(xL\fP.
+.LP
+The
+.ZN XtReleaseGC
+function deallocate the specified shared GC.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtGetKeyboardFocusWidget.man b/man/XtGetKeyboardFocusWidget.man
new file mode 100644 (file)
index 0000000..98dc691
--- /dev/null
@@ -0,0 +1,146 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtGet-Keyboard-Focus-Widget wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtGetKeyboardFocusWidget __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtGetKeyboardFocusWidget \- extension event handling
+.SH SYNTAX
+.HP
+Widget XtGetKeyboardFocusWidget(Widget \fIwidget\fP);
+.SH ARGUMENTS
+.IP \fIwidget\fP 1i
+Specifies the widget for this event handler.
+Must be of class Core or any subclass thereof.
+.SH DESCRIPTION
+.ZN XtGetKeyboardFocusWidget
+function returns the widget that would be the end result of keyboard
+event forwarding for a keyboard event for the specified widget.
+.SH "SEE ALSO"
+XtInsertEventTypeHandler(__libmansuffix__), XtRemoveEventTypeHandler(__libmansuffix__),
+XtRegisterExtensionSelector(__libmansuffix__), XtSetEventDispatcher(__libmansuffix__),
+XtDispatchEventToWidget(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtGetKeysymTable.man b/man/XtGetKeysymTable.man
new file mode 100644 (file)
index 0000000..8615b4d
--- /dev/null
@@ -0,0 +1,172 @@
+.\" Copyright (c) 1993, 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 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 dealing in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtGet-Keysym-Table XtKeysym-To-Keycode-List wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtGetKeysymTable __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtGetKeysymTable, XtKeysymToKeycodeList \- query keysyms and keycodes
+.SH SYNTAX
+.HP
+Keysym* XtGetKeysymTable(Display* \fIdisplay\fP, KeyCode*
+\fImin_keycode_return\fP, int *\fIkeysyms_per_keycode_return\fP);
+.HP
+void XtKeysymToKeycodeList(Display* \fIdisplay\fP, KeySym \fIkeysym\fP,
+KeyCode** \fIkeycodes_return\fP, Cardinal* \fIkeycount_return\fP);
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the display whose table is required.
+.LP
+.IP \fImin_keycode_return\fP 1i
+Returns the minimum KeyCode valid for the display.
+.LP
+.IP \fIkeysyms_per_keycode_return\fP
+Returns the number of KeySyms stored for each KeyCode.
+.LP
+.IP \fIkeysym\fP 1i
+Specifies the KeySym for which to search.
+.LP
+.IP \fIkeycodes_return\fP 1i
+Returns a list of KeyCodes that have \fIkeysym\fP associated with them,
+or NULL if \fIkeycount_return\fP is 0.
+.LP
+.IP \fIkeycount_return\fP 1i
+Returns the number of KeyCodes in the keycode list.
+.SH DESCRIPTION
+.ZN XtGetKeysymTable
+returns a pointer to the Intrinsics' copy of the server's KeyCode-to-KeySym
+table. This table must not be modified.
+.LP
+The
+.ZN XtKeysymToKeycodeList
+procedure returns all the KeyCodes that have \fIkeysym\fP in their
+entry for the keyboard mapping table associated with \fIdisplay\fP.
+The caller should free the storage pointed to by \fIkeycodes_return\fP
+using
+.ZN XtFree
+when it is no longer useful.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtGetMultiClickTime.man b/man/XtGetMultiClickTime.man
new file mode 100644 (file)
index 0000000..e9cef71
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtSetMultiClickTime.__libmansuffix__
diff --git a/man/XtGetResourceList.man b/man/XtGetResourceList.man
new file mode 100644 (file)
index 0000000..87b05fb
--- /dev/null
@@ -0,0 +1,187 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtGet-Resource-List XtGet-Constraint-Resource-List wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtGetResourceList __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtGetResourceList, XtGetConstraintResourceList \- obtain resource list
+.SH SYNTAX
+.HP
+void XtGetResourceList(WidgetClass \fIclass\fP, XtResourceList
+*\fIresources_return\fP, Cardinal *\fInum_resources_return\fP);
+.HP
+void XtGetConstraintResourceList(WidgetClass \fIclass\fP, XtResourceList
+*\fIresources_return\fP, Cardinal *\fInum_resources_return\fP);
+.SH ARGUMENTS
+.IP \fInum_resources_return\fP 1i
+Specifies a pointer to where to store the number of entries in the
+resource list.
+.IP \fIresources_return\fP 1i
+Specifies a pointer to where to store the returned resource list.
+The caller must free this storage using
+.ZN XtFree
+when done with it.
+.ds Cl \ for which you want the list
+.IP \fIwidget_class\fP 1i
+Specifies the widget class\*(Wc.
+.SH DESCRIPTION
+If
+.ZN XtGetResourceList
+is called before the widget class is initialized (that is,
+before the first widget of that class has been created),
+.ZN XtGetResourceList
+returns the resource list as specified in the widget class record.
+If it is called after the widget class has been initialized,
+.ZN XtGetResourceList
+returns a merged resource list that contains the resources
+for all superclasses. The list returned by
+.ZN XtGetResourceList
+should be freed using
+.ZN XtFree
+when it is no longer needed.
+.LP
+If
+.ZN XtGetConstraintResourceList
+is called before the widget class is initialized (that is,
+before the first widget of that class has been created),
+.ZN XtGetConstraintResourceList
+returns the resource list as specified in the widget class Constraint
+part record. If it is called after the widget class has been initialized,
+.ZN XtGetConstraintResourceList
+returns a merged resource list that contains the Constraint resources
+for all superclasses. If the specified class is not a subclass of
+.ZN constraintWidgetClass ,
+\fI*resources_return\fP is set to NULL and \fI*num_resources_return\fP
+is set to zero. The list returned by
+.ZN XtGetConstraintResourceList
+should be freed using
+.ZN XtFree
+when it is no longer needed.
+.SH "SEE ALSO"
+XtGetSubresources(__libmansuffix__),
+XtOffset(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtGetSelectionParameters.man b/man/XtGetSelectionParameters.man
new file mode 100644 (file)
index 0000000..aa475a8
--- /dev/null
@@ -0,0 +1,167 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtSet-Selection-Parameters XtGet-Selection-Parameters wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtGetSelectionParameters __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtGetSelectionParameters \- retrieve target parameters for a selection request with a single target
+.SH SYNTAX
+.HP
+void XtGetSelectionParameters(Widget \fIowner\fP, Atom \fIselection\fP,
+XtRequestId \fIrequest_id\fP, Atom *\fItype_return\fP, XtPointer
+*\fIvalue_return\fP, unsigned long *\fIlength_return\fP, int
+*\fIformat_return\fP);
+.SH ARGUMENTS
+.IP \fIowner\fP 1i
+Specifies the widget that owns the specified selection.
+.IP \fIselection\fP 1i
+Specifies the selection being processed.
+.IP \fIrequest_id\fP 1i
+Specifies the requestor id in the case of incremental selections, or NULL
+in the case of atomic transfers.
+.IP \fItype_return\fP 1i
+Specifies a pointer to an atom in which the property type of the
+parameters will be stored.
+.IP \fIvalue_return\fP 1i
+Specifies a pointer into which a pointer to the parameters are to be
+stored. A NULL will be stored if no parameters accompany the request.
+.IP \fIlength_return\fP 1i
+Specifies a pointer into which the number of data elements in
+\fIvalue_return\fP of size indicated by \fIformat_return\fP will be
+stored.
+.IP \fIformat_return\fP 1i
+Specifies a pointer into which the size in bits of the parameter data
+in the elements of \fIvalue_return\fP will be stored.
+.SH DESCRIPTION
+.ZN XtGetSelectionParameters
+may only be called from within an
+.ZN XtConvertSelectionProc
+or from within the last call to an
+.ZN XtConvertSelectionIncrProc
+with a new request_id.
+.SH "SEE ALSO"
+XtSetSelectionParameters(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtGetSelectionRequest.man b/man/XtGetSelectionRequest.man
new file mode 100644 (file)
index 0000000..7992230
--- /dev/null
@@ -0,0 +1,159 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtGet-Selection-Request wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtGetSelectionRequest __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtGetSelectionRequest \- retrieve the event that triggered the XtConvertSelectionProc
+.SH SYNTAX
+.HP
+XSelectionRequestEvent* XtGetSelectionRequest(Widget \fIw\fP, Atom
+\fIselection\fP, XtRequestId \fIrequest_id\fP);
+.SH ARGUMENTS
+.IP \fIw\fP 1i
+Specifies the widget.
+.IP \fIselection\fP 1i
+Specifies the selection being processed.
+.IP \fIrequest_id\fP 1i
+Specifies the requestor id in the case of incremental selections, or
+NULL in the case of atomic transfers.
+.SH DESCRIPTION
+.ZN XtGetSelectionRequest
+may only be called from within an
+.ZN XtConvertSelectionProc
+procedure and returns a pointer to the
+.ZN SelectionRequest
+event that caused the conversion procedure to be invoked. \fIRequest_id\fP
+specifies a unique id for the individual request in the case that
+multiple incremental transfers are outstanding. For atomic transfers,
+\fIrequest_id\fP must be specified as NULL. If no
+.ZN SelectionRequest
+event is being processed for the specified \fIwidget\fP, \fIselection\fP,
+and \fIrequest_id\fP,
+.ZN XtGetSelectionRequest
+returns NULL.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtGetSelectionTimeout.man b/man/XtGetSelectionTimeout.man
new file mode 100644 (file)
index 0000000..35ccb86
--- /dev/null
@@ -0,0 +1,151 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtGet-Selection-Timeout XtSet-Selection-Timeout wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtGetSelectionTimeout __libmansuffix__ __xorgversion__ "XT COMPATIBILITY FUNCTIONS"
+.SH NAME
+XtGetSelectionTimeout, XtSetSelectionTimeout \- set and obtain selection timeout values
+.SH SYNTAX
+.HP
+unsigned long XtGetSelectionTimeout(void);
+.HP
+void XtSetSelectionTimeout(unsigned long \fItimeout\fP);
+.SH ARGUMENTS
+.IP \fItimeout\fP 1i
+Specifies the selection timeout in milliseconds.
+.SH DESCRIPTION
+The
+.ZN XtGetSelectionTimeout
+function has been superceded by
+.ZN XtAppGetSelectionTimeout .
+.LP
+The
+.ZN XtSetSelectionTimeout
+function has been superceded by
+.ZN XtAppSetSelectionTimeout .
+.SH "SEE ALSO"
+.BR XtAppGetSelectionTimeout (__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtGetSelectionValue.man b/man/XtGetSelectionValue.man
new file mode 100644 (file)
index 0000000..9b46215
--- /dev/null
@@ -0,0 +1,196 @@
+.\" Copyright (c) 1993, 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 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 dealing in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtGet-Selection-Value XtGet-Selection-Values wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtGetSelectionValue __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtGetSelectionValue, XtGetSelectionValues \- obtain selection values
+.SH SYNTAX
+.HP
+void XtGetSelectionValue(Widget \fIw\fP, Atom \fIselection\fP, Atom
+\fItarget\fP, XtSelectionCallbackProc \fIcallback\fP, XtPointer
+\fIclient_data\fP, Time \fItime\fP);
+.HP
+void XtGetSelectionValues(Widget \fIw\fP, Atom \fIselection\fP, Atom
+*\fItargets\fP, int \fIcount\fP, XtSelectionCallbackProc \fIcallback\fP,
+XtPointer \fIclient_data\fP, Time \fItime\fP);
+.SH ARGUMENTS
+.ds Cb \ that is to be called when the selection value has been obtained
+.IP \fIcallback\fP 1i
+Specifies the callback procedure\*(Cb.
+.ds Cd it is called
+.IP \fIclient_data\fP 1i
+Specifies the argument that is to be passed to the specified procedure
+when \*(Cd.
+.IP \fIclient_data\fP 1i
+Specifies the client data (one for each target type)
+that is passed to the callback procedure when it is called for that target.
+.IP \fIcount\fP 1i
+Specifies the length of the targets and client_data lists.
+.IP \fIselection\fP 1i
+Specifies the particular selection desired (that is, primary or secondary).
+.IP \fItarget\fP 1i
+Specifies the type of the information that is needed about the selection.
+.IP \fItargets\fP 1i
+Specifies the types of information that is needed about the selection.
+.ds Ti value is desired
+.IP \fItime\fP 1i
+Specifies the timestamp that indicates when the selection \*(Ti.
+.ds Wi that is making the request
+.IP \fIw\fP 1i
+Specifies the widget \*(Wi.
+.SH DESCRIPTION
+The
+.ZN XtGetSelectionValue
+function requests the value of the selection that has been converted to
+the target type.
+The specified callback will be called some time after
+.ZN XtGetSelectionValue
+is called;
+in fact, it may be called before or after
+.ZN XtGetSelectionValue
+returns.
+.LP
+The
+.ZN XtGetSelectionValues
+function is similar to
+.ZN XtGetSelectionValue
+except that it takes a list of target types and a list of client data
+and obtains the current value of the selection converted to each of the targets.
+The effect is as if each target were specified in a separate call to
+.ZN XtGetSelectionValue .
+The callback is called once with the corresponding client data for each target.
+.ZN XtGetSelectionValues
+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 when calling
+.ZN XtGetSelectionValue
+repeatedly.
+.SH "SEE ALSO"
+XtAppGetSelectionTimeout(__libmansuffix__),
+XtOwnSelection(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtGetSelectionValueIncremental.man b/man/XtGetSelectionValueIncremental.man
new file mode 100644 (file)
index 0000000..aee1727
--- /dev/null
@@ -0,0 +1,201 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtGet-Selection-Value-Incremental XtGet-Selection-Values-Incremental wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtGetSelectionValueIncremental __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtGetSelectionValueIncremental, XtGetSelectionValuesIncremental \- obtain selection values
+.SH SYNTAX
+.HP
+void XtGetSelectionValueIncremental(Widget \fIw\fP, Atom \fIselection\fP, Atom
+\fItarget\fP, XtSelectionCallbackProc \fIcallback\fP, XtPointer
+\fIclient_data\fP, Time \fItime\fP);
+.HP
+void XtGetSelectionValuesIncremental(Widget \fIw\fP, Atom \fIselection\fP,
+Atom *\fItargets\fP, int \fIcount\fP, XtSelectionCallbackProc \fIcallback\fP,
+XtPointer \fIclient_data\fP, Time \fItime\fP);
+.SH ARGUMENTS
+.ds Cb \ that is to be called when the selection value has been obtained
+.IP \fIcallback\fP 1i
+Specifies the callback procedure\*(Cb.
+.ds Cd it is called
+.IP \fIclient_data\fP 1i
+Specifies the argument that is to be passed to the specified procedure
+when \*(Cd.
+.IP \fIclient_data\fP 1i
+Specifies the client data (one for each target type)
+that is passed to the callback procedure when it is called for that target.
+.IP \fIcount\fP 1i
+Specifies the length of the targets and client_data lists.
+.IP \fIselection\fP 1i
+Specifies the particular selection desired (that is, primary or secondary).
+.IP \fItarget\fP 1i
+Specifies the type of the information that is needed about the selection.
+.IP \fItargets\fP 1i
+Specifies the types of information that is needed about the selection.
+.ds Ti value is desired
+.IP \fItime\fP 1i
+Specifies the timestamp that indicates when the selection \*(Ti.
+.ds Wi that is making the request
+.IP \fIw\fP 1i
+Specifies the widget \*(Wi.
+.SH DESCRIPTION
+The
+.ZN XtGetSelectionValueIncremental
+function is similar to
+.ZN XtGetSelectionValue
+except that the \fIselection_callback\fP procedure will be called
+repeatedly upon delivery of multiple segments of the selection value.
+The end of the selection value is indicated when \fIselection_callback\fP
+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 to timeout), the
+\fIselection_callback\fP procedure is called with a type value equal
+to the symbolic constant
+.ZN XT_CONVERT_FAIL
+so that the requestor can dispose of the partial selection value it has
+collected up until that point. Upon receiving
+.ZN XT_CONVERT_FAIL ,
+the requesting client must determine for itself whether or not a
+partially completed transfer is meaningful.
+.LP
+The
+.ZN XtGetSelectionValuesIncremental
+function is similar to
+.ZN XtGetSelectionValueIncremental
+except that it takes a list of target types and a list of client data
+and obtains the current value of the selection converted to each of the targets.
+The effect is as if each target were specified in a separate call to
+.ZN XtGetSelectionValueIncremental .
+The callback is called once with the corresponding client data for each target.
+.ZN XtGetSelectionValuesIncremental
+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 when calling
+.ZN XtGetSelectionValueIncremental
+repeatedly.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtGetSelectionValues.man b/man/XtGetSelectionValues.man
new file mode 100644 (file)
index 0000000..34d5174
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtGetSelectionValue.__libmansuffix__
diff --git a/man/XtGetSelectionValuesIncremental.man b/man/XtGetSelectionValuesIncremental.man
new file mode 100644 (file)
index 0000000..3d794f0
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtGetSelectionValueIncremental.__libmansuffix__
diff --git a/man/XtGetSubresources.man b/man/XtGetSubresources.man
new file mode 100644 (file)
index 0000000..7645ece
--- /dev/null
@@ -0,0 +1,180 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtGet-Subresources XtVa-Get-Subresources wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtGetSubresources __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtGetSubresources, XtVaGetSubresources \- obtain subresources
+.SH SYNTAX
+.HP
+void XtGetSubresources(Widget \fIw\fP, XtPointer \fIbase\fP, String
+\fIname\fP, String \fIclass\fP, XtResourceList \fIresources\fP, Cardinal
+\fInum_resources\fP, ArgList \fIargs\fP, Cardinal \fInum_args\fP);
+.HP
+void XtVaGetSubresources(Widget \fIw\fP, XtPointer \fIbase\fP, String
+\fIname\fP, String \fIclass\fP, XtResourceList \fIresources\fP, Cardinal
+\fInum_resources\fP);
+.SH ARGUMENTS
+.ds Al to override resources obtained from the resource database
+.IP \fIargs\fP 1i
+Specifies the argument list \*(Al.
+.ds Ba written
+.IP \fIbase\fP 1i
+Specifies the base address of the subpart data structure where the resources
+should be \*(Ba.
+.IP \fIclass\fP 1i
+Specifies the class of the subpart.
+.IP \fIname\fP 1i
+Specifies the name of the subpart.
+.IP \fInum_args\fP 1i
+Specifies the number of arguments in the argument list.
+.IP \fInum_resources\fP 1i
+Specifies the number of resources in the resource list.
+.IP \fIresources\fP 1i
+Specifies the resource list for the subpart.
+.ds Wi that wants resources for a subpart \
+or that identifies the resource database to search
+.IP \fIw\fP 1i
+Specifies the widget \*(Wi.
+.IP \fI...\fP 1i
+Specifies the variable arguments \*(Al.
+.SH DESCRIPTION
+The
+.ZN XtGetSubresources
+function constructs a name/class list from the application name/class,
+the name/classes of all its ancestors, and the widget itself.
+Then, it appends to this list the name/class 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 args is NULL,
+num_args must be zero.
+However, if num_args is zero,
+the argument list is not referenced.
+.SH "SEE ALSO"
+XtGetApplicationResources, XtVaGetApplicationResources
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtGetSubvalues.man b/man/XtGetSubvalues.man
new file mode 100644 (file)
index 0000000..a7e954e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtSetValues.__libmansuffix__
diff --git a/man/XtGetValues.man b/man/XtGetValues.man
new file mode 100644 (file)
index 0000000..a7e954e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtSetValues.__libmansuffix__
diff --git a/man/XtGrabButton.man b/man/XtGrabButton.man
new file mode 100644 (file)
index 0000000..3d7d5c3
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtGrabKey.__libmansuffix__
diff --git a/man/XtGrabKey.man b/man/XtGrabKey.man
new file mode 100644 (file)
index 0000000..2201698
--- /dev/null
@@ -0,0 +1,311 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtGrab-Key XtUngrab-Key XtGrab-Keyboard XtUngrab-Keyboard XtGrab-Button XtUngrab-Button XtGrab-Pointer XtUngrab-Pointer wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtGrabKey __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtGrabKey, XtUngrabKey, XtGrabKeyboard, XtUngrabKeyboard, XtGrabButton, XtUngrabButton, XtGrabPointer, XtUngrabPointer \- manage grabs
+.SH SYNTAX
+.HP
+void XtGrabKey(Widget \fIwidget\fP, KeyCode \fIkeycode\fP, Modifiers
+\fImodifiers\fP, Boolean \fIowner_events\fP, int \fIpointer_mode\fP, int
+\fIkeyboard_mode\fP);
+.HP
+void XtUngrabKey(Widget \fIwidget\fP, KeyCode \fIkeycode\fP, Modifiers
+\fImodifiers\fP);
+.HP
+int XtGrabKeyboard(Widget \fIwidget\fP, Boolean \fIowner_events\fP, int
+\fIpointer_mode\fP, int \fIkeyboard_mode\fP, Time \fItime\fP);
+.HP
+void XtUngrabKeyboard(Widget \fIwidget\fP, Time \fItime\fP);
+.HP
+void XtGrabButton(Widget \fIwidget\fP, int \fIbutton\fP, Modifiers
+\fImodifiers\fP, Boolean \fIowner_events\fP, unsigned int \fIevent_mask\fP,
+int \fIpointer_mode\fP, int \fIkeyboard_mode\fP, Window \fIconfine_to\fP,
+Cursor \fIcursor\fP);
+.HP
+void XtUngrabButton(Widget \fIwidget\fP, KeyCode \fIbutton\fP, Modifiers
+\fImodifiers\fP);
+.HP
+int XtGrabPointer(Widget \fIwidget\fP, Boolean \fIowner_events\fP, unsigned
+int \fIevent_mask\fP, int \fIpointer_mode\fP, int \fIkeyboard_mode\fP, Window
+\fIconfine_to\fP, Cursor \fIcursor\fP, Time \fItime\fP);
+.HP
+void XtUngrabPointer(Widget \fIwidget\fP, Time \fItime\fP);
+.SH ARGUMENTS
+.IP \fIwidget\fP 1i
+Specifies the widget in whose window the grab will occur. Must be of
+class Core or a subclass thereof.
+.sp 6p
+.IP \fIkeycode\fP
+.br
+.ns
+.IP \fImodifiers\fP
+.br
+.ns
+.IP \fIowner_events\fP
+.br
+.ns
+.IP \fIpointer_mode\fP
+.br
+.ns
+.IP \fIkeyboard_mode\fP
+.br
+.ns
+.IP \fItime\fP
+.br
+.ns
+.IP \fIbutton\fP
+.br
+.ns
+.IP \fIconfine_to\fP
+.br
+.ns
+.IP \fIcursor\fP 1i
+Specifies arguments to the associated Xlib function call.
+.SH DESCRIPTION
+.ZN XtGrabKey
+calls
+.ZN XGrabKey
+specifying the widget's window as the grab window if the widget is
+realized. The remaining arguments are exactly as for
+.ZN XGrabKey .
+If the widget is not realized, or is later unrealized, the call to
+.ZN XGrabKey
+will be performed (again) when the widget is realized and its window
+becomes mapped. In the future, if
+.ZN XtDispatchEvent
+is called with a
+.ZN KeyPress
+event matching the specified keycode and modifiers (which may be
+.ZN AnyKey
+or
+.ZN AnyModifier ,
+respectively) for the widget's window, the Intrinsics will call
+.ZN XtUngrabKeyboard
+with the timestamp from the
+.ZN KeyPress
+event if either of the following conditions is true:
+.IP \(bu 3
+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
+.IP \(bu 3
+.ZN XFilterEvent
+returns
+.ZN True .
+.LP
+.ZN XtUngrabKey
+calls
+.ZN XUngrabKey
+specifying the widget's window as the ungrab window if the widget is
+realized. The remaining arguments are exactly as for
+.ZN XUngrabKey .
+If the widget is not realized,
+.ZN XtUngrabKey
+removes a deferred
+.ZN XtGrabKey
+request, if any, for the specified widget, keycode, and modifiers.
+.LP
+If the specified widget is realized
+.ZN XtGrabKeyboard
+calls
+.ZN XGrabKeyboard
+specifying the widget's window as the grab window. The remaining
+arguments and return value are exactly as for
+.ZN XGrabKeyboard .
+If the widget is not realized,
+.ZN XtGrabKeyboard
+immediately returns
+.ZN GrabNotViewable .
+No future ungrab is implied by
+.ZN XtGrabKeyboard .
+.LP
+.ZN XtUngrabKeyboard
+calls
+.ZN XUngrabKeyboard
+with the specified time.
+.LP
+.ZN XtGrabButton
+calls
+.ZN XGrabButton
+specifying the widget's window as the grab window if the widget is
+realized. The remaining arguments are exactly as for
+.ZN XGrabButton .
+If the widget is not realized, or is later unrealized, the call to
+.ZN XGrabButton
+will be performed (again) when the widget is realized and its window
+becomes mapped. In the future, if
+.ZN XtDispatchEvent
+is called with a
+.ZN ButtonPress
+event matching the specified button and modifiers (which may be
+.ZN AnyButton
+or
+.ZN AnyModifier ,
+respectively) for the widget's window, the Intrinsics will call
+.ZN XtUngrabPointer
+with the timestamp from the
+.ZN ButtonPress
+event if either of the following conditions is true:
+.IP \(bu 3
+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
+.IP \(bu 3
+.ZN XFilterEvent
+returns
+.ZN True .
+.LP
+.ZN XtUngrabButton
+calls
+.ZN XUngrabButton
+specifying the widget's window as the ungrab window if the widget is
+realized. The remaining arguments are exactly as for
+.ZN XUngrabButton .
+If the widget is not realized,
+.ZN XtUngrabButton
+removes a deferred
+.ZN XtGrabButton
+request, if any, for the specified widget, button, and modifiers.
+.LP
+.ZN XtGrabPointer
+calls
+.ZN XGrabPointer
+specifying the widget's window as the grab window. The remaining
+arguments and return value are exactly as for
+.ZN XGrabPointer .
+If the widget is not realized,
+.ZN XtGrabPointer
+immediately returns
+.ZN GrabNotViewable .
+No future ungrab is implied by
+.ZN XtGrabPointer .
+.LP
+.ZN XtUngrabPointer
+calls
+.ZN XUngrabPointer
+with the specified time.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtGrabKeyboard.man b/man/XtGrabKeyboard.man
new file mode 100644 (file)
index 0000000..3d7d5c3
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtGrabKey.__libmansuffix__
diff --git a/man/XtGrabPointer.man b/man/XtGrabPointer.man
new file mode 100644 (file)
index 0000000..3d7d5c3
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtGrabKey.__libmansuffix__
diff --git a/man/XtHasCallbacks.man b/man/XtHasCallbacks.man
new file mode 100644 (file)
index 0000000..c254850
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtCallCallbacks.__libmansuffix__
diff --git a/man/XtHooksOfDisplay.man b/man/XtHooksOfDisplay.man
new file mode 100644 (file)
index 0000000..73c6992
--- /dev/null
@@ -0,0 +1,143 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtHooks-Of-Display XtGet-Displays wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtHooksOfDisplay __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtHooksOfDisplay \- external agent access points
+.SH SYNTAX
+.HP
+Widget XtHooksOfDisplay(Display* \fIdisplay\fP);
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the desired display.
+.SH DESCRIPTION
+The class of this object is a private, implementation dependent, subclass
+of Object. 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.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtInitialize.man b/man/XtInitialize.man
new file mode 100644 (file)
index 0000000..6bb6016
--- /dev/null
@@ -0,0 +1,172 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw Xt-Initialize
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtInitialize __libmansuffix__ __xorgversion__ "XT COMPATIBILITY FUNCTIONS"
+.SH NAME
+XtInitialize \- initialize
+.SH SYNTAX
+.HP
+Widget XtInitialize(String \fIshell_name\fP, String \fIapplication_class\fP,
+XrmOptionDescRec* \fIoptions\fP, Cardinal \fInum_options\fP, int* \fIargc\fP,
+char** \fIargv\fP);
+.SH ARGUMENTS
+.IP \fIshell_name\fP 1i
+Specifies the name of the created shell widget.
+.ds Ac , which usually is the generic name for all instances of this application
+.IP \fIapplication_class\fP 1i
+Specifies the class name of this application\*(Ac.
+.IP \fIoptions\fP 1i
+Specifies how to parse the command line for any application-specific resources.
+The options argument is passed as a parameter to
+.ZN XrmParseCommand .
+For further information,
+see \fI\*(xL\fP.
+.IP \fInum_options\fP 1i
+Specifies the number of entries in the options list.
+.IP \fIargc\fP 1i
+Specifies a pointer to the number of command line parameters.
+.IP \fIargv\fP 1i
+Specifies the command line parameters.
+.SH DESCRIPTION
+.ZN XtInitialize
+calls
+.ZN XtToolkitInitialize
+followed by
+.ZN XtOpenDisplay
+with \fIdisplay_string\fP NULL and \fIapplication_name\fP NULL, and
+finally calls
+.ZN XtAppCreateShell
+with \fIapplication_name\fP NULL, \fIwidget_class\fP
+.ZN applicationShellWidgetClass ,
+and the specified \fIargs\fP and \fInum_args\fP and returns the
+created shell. The semantics of calling
+.ZN XtInitialize
+more than once are undefined. This routine has been replaced by
+.ZN XtAppInitialize .
+.SH "SEE ALSO"
+.BR XtAppInitialize (__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtInitializeWidgetClass.man b/man/XtInitializeWidgetClass.man
new file mode 100644 (file)
index 0000000..4d557f5
--- /dev/null
@@ -0,0 +1,148 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtInitialize-Widget-Class wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtInitializeWidgetClass __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtInitializeWidgetClass \- initialize a widget class
+.SH SYNTAX
+.HP
+void XtInitializeWidgetClass(WidgetClass \fIobject_class\fP);
+.SH ARGUMENTS
+.IP \fIobject_class\fP 1i
+Specifies the object class to initialize.
+.SH DESCRIPTION
+If the specified widget class is already initialized,
+.ZN XtInitializeWidgetClass
+returns immediately.
+.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
+.ZN XtInitializeWidgetClass
+is called.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtInsertEventHandler.man b/man/XtInsertEventHandler.man
new file mode 100644 (file)
index 0000000..ab49e9e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAddEventHandler.__libmansuffix__
diff --git a/man/XtInsertEventTypeHandler.man b/man/XtInsertEventTypeHandler.man
new file mode 100644 (file)
index 0000000..ef08be3
--- /dev/null
@@ -0,0 +1,289 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtInsert-Event-Type-Handler XtRemove-Event-Type-Handler XtSet-Event-Dispatcher XtDispatch-Event-To-Widget wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtInsertEventTypeHandler __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtInsertEventTypeHandler, XtRemoveEventTypeHandler,
+XtRegisterExtensionSelector, XtSetEventDispatcher, XtDispatchEventToWidget
+\- extension event handling
+.SH SYNTAX
+.HP
+void XtInsertEventTypeHandler(Widget \fIwidget\fP, int \fIevent_type\fP,
+XtPointer \fIselect_data\fP, XtEventHandler \fIproc\fP, XtPointer
+\fIclient_data\fP, XtListPosition \fIposition\fP);
+.HP
+void XtRemoveEventTypeHandler(Widget \fIwidget\fP, int \fIevent_type\fP,
+XtPointer \fIselect_data\fP, XtEventHandler \fIproc\fP, XtPointer
+\fIclient_data\fP);
+.HP
+void XtRegisterExtensionSelector(Display* \fIdisplay\fP, int
+\fImin_event_type\fP, int \fImax_event_type\fP, XtExtensionSelectProc
+\fIproc\fP, XtPointer \fIclient_data\fP);
+.HP
+XtEventDispatchProc XtSetEventDispatcher(Widget \fIwidget\fP, int
+\fIevent_type\fP, XtEventDispatchProc \fIproc\fP);
+.HP
+Boolean XtDispatchEventToWidget(Widget \fIwidget\fP, XEvent* \fIevent\fP);
+.SH ARGUMENTS
+.IP \fIwidget\fP 1i
+Specifies the widget for this event handler.
+Must be of class Core or any subclass thereof.
+.IP \fIevent_type\fP 1i
+Specifies the event type.
+.IP \fIselect_data\fP 1i
+Specifies data used to select or deselect events from the server.
+.IP \fIproc\fP 1i
+Specifies the proc.
+.IP \fIclient_data\fP 1i
+Specifies additional data to be passed to the event handler.
+.IP \fIposition\fP 1i
+Specifies when the event handler is to be called relative to other
+previously registered handlers.
+.IP \fIdisplay\fP 1i
+Specifies the display.
+.IP \fImin_event_type,\ max_event_type\fP 1i
+Specifies the range of event types for this extension.
+.IP \fIevent\fP 1i
+Specifies a pointer to the event to be dispatched.
+.SH DESCRIPTION
+The
+.ZN XtInsertEventTypeHandler
+function registers a procedure with the dispatch mechanism that is to
+be called when an event that matches the specified \fIevent_type\fP is
+dispatched to the specified \fIwidget\fP.
+.LP
+If \fIevent_type\fP is one of the core X protocol events then
+\fIselect_data\fP must be a pointer to a value of type
+.ZN EventMask ,
+indicating the event mask to be used to select for the desired event.
+This event mask will be included in the value returned by
+.ZN XtBuildEventMask .
+If the widget is realized
+.ZN XtInsertEventTypeHandler
+calls
+.ZN XSelectInput
+if necessary. Specifying NULL for \fIselect_data\fP is equivalent to
+specifying a pointer to an event mask containing 0. This is similar to the
+.ZN XtInsertRawEventHandler
+function.
+.LP
+If \fIevent_type\fP specifies an extension event type then the semantics
+of the data pointed to by \fIselect_data\fP are defined by the extension
+selector registered for the specified event type.
+.LP
+In either case the Intrinsics are not required to copy the data pointed
+to by \fIselect_data\fP, so the caller must ensure that it remains valid
+as long as the event handler remains registered with this value of
+\fIselect_data\fP.
+.LP
+The \fIposition\fP argument allows the client to control the order of the
+invocation of event handlers registered for the same event type. If the
+client does not care about the order, it should normally specify
+.ZN XtListTail ,
+which registers this event handler after any previously registered
+handlers for this event type.
+.LP
+The
+.ZN XtRemoveEventTypeHandler
+function unregisters an even handler registered with
+.ZN XtInsertEventTypeHandler
+for the specified event type. The request is ignored if \fIclient_data\fP
+does not match the value given with the handler was registered.
+.LP
+If \fIevent_type\fP specifies on of the core X protocol events,
+\fIselect_data\fP must be a pointer to a value of type
+.ZN EventMask ,
+indicating the mask to be used to deselect for the appropriate event.
+If the widget is realized,
+.ZN XtRemoveEventTypeHandler
+calls
+.ZN XSelectInput
+if necessary. Specifying NULL for \fIselect_data\fP is equivalent to
+specifying a pointer to an event mask containing 0. This is similar to the
+.ZN XtRemoveRawEventHandler
+function.
+.LP
+If \fIevent_type\fP specifies an extension event type then the semantics
+of the data pointed to by \fIselect_data\fP are defined by the extension
+selector registered for the specified event type.
+.LP
+The
+.ZN XtRegisterExtensionSelector
+function registers a procedure to arrange for the delivery of extension
+events to widgets.
+.LP
+If \fImin_event_type\fP and \fImax_event_type\fP match the parameters to
+a previous call to
+.ZN XtRegisterExtensionSelector
+for the same display, the \fIproc\fP and \fIclient_data\fP replace the
+previously registered values. If the range specified by \fImin_event_type\fP
+and \fImax_event_type\fP overlaps the range of the parameters to a
+previous call for the same display in any other way, an error results.
+.LP
+The
+.ZN XtSetEventDispatcher
+function registers the event dispatcher procedure specified by \fIproc\fP
+for events with the type \fIevent_type\fP. The previously registered
+dispatcher (or the default dispatcher if there was no previously registered
+dispatcher) is returned. If \fIproc\fP is NULL, the default procedure is
+restored for the specified type.
+.LP
+In the future, when
+.ZN XtDispatchEvent
+is called with an event of \fIevent_type\fP, the specified \fIproc\fP (or
+the default dispatcher) will be invoked to determine a widget ot which
+to dispatch the event.
+.LP
+The
+.ZN XtDispatchEventToWidget
+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 \fIcontinue_to_dispatch\fP value returned by
+each handler. The Intrinsics behave as if event handlers were registered
+at the head of the list for
+.ZN Expose ,
+.ZN NoExpose ,
+.ZN GraphicsExpose ,
+and
+.ZN VisibilityNotify
+events to invoke the widget's expose procedure according to the exposure
+compression rules and to update the widget's \fIvisible\fP field if
+\fIvisible_interest\fP is
+.ZN True .
+These internal event handlers never set \fIcontinue_to_dispatch\fP to
+.ZN False .
+.LP
+.ZN XtDispatchEventToWidget
+returns
+.ZN True
+if any event handler was called and
+.ZN False
+otherwise.
+.LP
+.SH "SEE ALSO"
+XtGetKeyboardFocusWidget(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtInsertRawEventHandler.man b/man/XtInsertRawEventHandler.man
new file mode 100644 (file)
index 0000000..ab49e9e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAddEventHandler.__libmansuffix__
diff --git a/man/XtInstallAccelerators.man b/man/XtInstallAccelerators.man
new file mode 100644 (file)
index 0000000..fa38d26
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtParseAcceleratorTable.__libmansuffix__
diff --git a/man/XtInstallAllAccelerators.man b/man/XtInstallAllAccelerators.man
new file mode 100644 (file)
index 0000000..fa38d26
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtParseAcceleratorTable.__libmansuffix__
diff --git a/man/XtIsApplicationShell.man b/man/XtIsApplicationShell.man
new file mode 100644 (file)
index 0000000..99800c9
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtClass.__libmansuffix__
diff --git a/man/XtIsComposite.man b/man/XtIsComposite.man
new file mode 100644 (file)
index 0000000..99800c9
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtClass.__libmansuffix__
diff --git a/man/XtIsConstraint.man b/man/XtIsConstraint.man
new file mode 100644 (file)
index 0000000..99800c9
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtClass.__libmansuffix__
diff --git a/man/XtIsManaged.man b/man/XtIsManaged.man
new file mode 100644 (file)
index 0000000..98b4bb6
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtManageChildren.__libmansuffix__
diff --git a/man/XtIsObject.man b/man/XtIsObject.man
new file mode 100644 (file)
index 0000000..99800c9
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtClass.__libmansuffix__
diff --git a/man/XtIsOverrideShell.man b/man/XtIsOverrideShell.man
new file mode 100644 (file)
index 0000000..99800c9
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtClass.__libmansuffix__
diff --git a/man/XtIsRealized.man b/man/XtIsRealized.man
new file mode 100644 (file)
index 0000000..ad4af05
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtRealizeWidget.__libmansuffix__
diff --git a/man/XtIsRectObj.man b/man/XtIsRectObj.man
new file mode 100644 (file)
index 0000000..99800c9
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtClass.__libmansuffix__
diff --git a/man/XtIsSensitive.man b/man/XtIsSensitive.man
new file mode 100644 (file)
index 0000000..7bd86fd
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtSetSensitive.__libmansuffix__
diff --git a/man/XtIsSessionShell.man b/man/XtIsSessionShell.man
new file mode 100644 (file)
index 0000000..99800c9
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtClass.__libmansuffix__
diff --git a/man/XtIsShell.man b/man/XtIsShell.man
new file mode 100644 (file)
index 0000000..99800c9
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtClass.__libmansuffix__
diff --git a/man/XtIsSubclass.man b/man/XtIsSubclass.man
new file mode 100644 (file)
index 0000000..99800c9
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtClass.__libmansuffix__
diff --git a/man/XtIsTopLevelShell.man b/man/XtIsTopLevelShell.man
new file mode 100644 (file)
index 0000000..99800c9
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtClass.__libmansuffix__
diff --git a/man/XtIsTransientShell.man b/man/XtIsTransientShell.man
new file mode 100644 (file)
index 0000000..99800c9
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtClass.__libmansuffix__
diff --git a/man/XtIsVendorShell.man b/man/XtIsVendorShell.man
new file mode 100644 (file)
index 0000000..99800c9
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtClass.__libmansuffix__
diff --git a/man/XtIsWMShell.man b/man/XtIsWMShell.man
new file mode 100644 (file)
index 0000000..99800c9
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtClass.__libmansuffix__
diff --git a/man/XtIsWidget.man b/man/XtIsWidget.man
new file mode 100644 (file)
index 0000000..99800c9
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtClass.__libmansuffix__
diff --git a/man/XtKeysymToKeycodeList.man b/man/XtKeysymToKeycodeList.man
new file mode 100644 (file)
index 0000000..7720a2f
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtGetKeysymTable.__libmansuffix__
diff --git a/man/XtLastEventProcessed.man b/man/XtLastEventProcessed.man
new file mode 100644 (file)
index 0000000..c6c8453
--- /dev/null
@@ -0,0 +1,162 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtLast-Event-Processed XtLast-Timestamp-Processed wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtLastEventProcessed __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtLastEventProcessed, XtLastTimestampProcessed \- last event, last timestamp processed
+.SH SYNTAX
+.HP
+XEvent* XtLastEventProcessed(Display* \fIdisplay\fP);
+.HP
+Time XtLastTimestampProcessed(Display* \fIdisplay\fP);
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the open display connection.
+.SH DESCRIPTION
+.ZN XtLastEventProcessed
+returns the last event passed to
+.ZN XtDispatchEvent
+for the specified display and NULL if there has been no event. The
+client must not modify the contents of the returned event.
+.LP
+.ZN XtLastTimestampProcessed
+returns the timestamp of the last
+.ZN KeyPress ,
+.ZN KeyRelease ,
+.ZN ButtonPress ,
+.ZN ButtonRelease ,
+.ZN MotionNotify ,
+.ZN EnterNotify ,
+.ZN LeaveNotify ,
+.ZN PropertyNotify ,
+or
+.ZN SelectionClear
+event that has been passed to
+.ZN XtDispatchEvent
+for the specified display and zero if there has been no such event.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtLastTimestampProcessed.man b/man/XtLastTimestampProcessed.man
new file mode 100644 (file)
index 0000000..4aac3cc
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtLastEventProcessed.__libmansuffix__
diff --git a/man/XtMainLoop.man b/man/XtMainLoop.man
new file mode 100644 (file)
index 0000000..f049c5b
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtNextEvent.__libmansuffix__
diff --git a/man/XtMakeGeometryRequest.man b/man/XtMakeGeometryRequest.man
new file mode 100644 (file)
index 0000000..a696df3
--- /dev/null
@@ -0,0 +1,237 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtMake-Geometry-Request XtMake-Resize-Request wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtMakeGeometryRequest __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtMakeGeometryRequest, XtMakeResizeRequest \- make geometry manager request
+.SH SYNTAX
+.HP
+XtGeometryResult XtMakeGeometryRequest(Widget \fIw\fP, XtWidgetGeometry
+*\fIrequest\fP, XtWidgetGeometry *\fIreply_return\fP);
+.HP
+XtGeometryResult XtMakeResizeRequest(Widget \fIw\fP, Dimension \fIwidth\fP,
+\fIheight\fP, Dimension *\fIwidth_return\fP, Dimension *\fIheight_return\fP);
+.SH ARGUMENTS
+.IP \fIreply_return\fP 1i
+Returns the allowed widget size or may be NULL
+if the requesting widget is not interested in handling
+.ZN XtGeometryAlmost .
+.IP \fIrequest\fP 1i
+Specifies the desired widget geometry (size, position, border width,
+and stacking order).
+.ds Wi that is making the request
+.IP \fIw\fP 1i
+Specifies the widget \*(Wi.
+.IP \fIwidth_return\fP 1i
+.br
+.ns
+.IP \fIheight_return\fP 1i
+Return the allowed widget width and height.
+.SH DESCRIPTION
+Depending on the condition,
+.ZN XtMakeGeometryRequest
+performs the following:
+.IP \(bu 5
+If the widget is unmanaged or the widget's parent is not realized,
+it makes the changes and returns
+.ZN XtGeometryYes .
+.IP \(bu 5
+If the parent is not a subclass of
+.ZN compositeWidgetClass
+or the parent's geometry_manager is NULL,
+it issues an error.
+.IP \(bu 5
+If the widget's being_destroyed field is
+.ZN True ,
+it returns
+.ZN XtGeometryNo .
+.IP \(bu 5
+If the widget x, y, width, height and border_width fields are
+all equal to the requested values,
+it returns
+.ZN XtGeometryYes ;
+otherwise, it calls the parent's geometry_manager procedure
+with the given parameters.
+.IP \(bu 5
+If the parent's geometry manager returns
+.ZN XtGeometryYes
+and if
+.ZN XtCWQueryOnly
+is not set in the request_mode
+and if the widget is realized,
+.ZN XtMakeGeometryRequest
+calls the
+.ZN XConfigureWindow
+Xlib function to reconfigure the widget's window (set its size, location,
+and stacking order as appropriate).
+.IP \(bu 5
+If the geometry manager returns
+.ZN XtGeometryDone ,
+the change has been approved and actually has been done.
+In this case,
+.ZN XtMakeGeometryRequest
+does no configuring and returns
+.ZN XtGeometryYes .
+.ZN XtMakeGeometryRequest
+never returns
+.ZN XtGeometryDone .
+.LP
+Otherwise,
+.ZN XtMakeGeometryRequest
+returns the resulting value from the parent's geometry manager.
+.LP
+Children of primitive widgets are always unmanaged; thus,
+.ZN XtMakeGeometryRequest
+always returns
+.ZN XtGeometryYes
+when called by a child of a primitive widget.
+.LP
+The
+.ZN XtMakeResizeRequest
+function, a simple interface to
+.ZN XtMakeGeometryRequest ,
+creates a
+.ZN XtWidgetGeometry
+structure and specifies that width and height should change.
+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
+.ZN XtGeometryAlmost ,
+width_return and height_return contain a compromise width and height.
+If these are acceptable,
+the widget should immediately make an
+.ZN XtMakeResizeRequest
+and request that the compromise width and height be applied.
+If the widget is not interested in
+.ZN XtGeometryAlmost
+replies,
+it can pass NULL for width_return and height_return.
+.SH "SEE ALSO"
+XtConfigureWidget(__libmansuffix__),
+XtQueryGeometery(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtMakeResizeRequest.man b/man/XtMakeResizeRequest.man
new file mode 100644 (file)
index 0000000..864fc52
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtMakeGeometryRequest.__libmansuffix__
diff --git a/man/XtMalloc.man b/man/XtMalloc.man
new file mode 100644 (file)
index 0000000..f36728d
--- /dev/null
@@ -0,0 +1,251 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtNew-String wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtMalloc __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtMalloc, XtCalloc, XtRealloc, XtFree, XtNew, XtNewString \- memory management functions
+.SH SYNTAX
+.HP
+char *XtMalloc(Cardinal \fIsize\fP);
+.HP
+char *XtCalloc(Cardinal \fInum\fP, Cardinal \fIsize\fP);
+.HP
+char *XtRealloc(char *\fIptr\fP, Cardinal \fInum\fP);
+.HP
+void XtFree(char *\fIptr\fP);
+.HP
+\fItype\fP *XtNew(\fItype\fP);
+.HP
+String XtNewString(String \fIstring\fP);
+.HP
+Cardinal XtAsprintf(String *\fInew_string\fP, const char *\fIformat\fP, ...);
+.SH ARGUMENTS
+.IP \fInum\fP 1i
+Specifies the number of bytes or array elements.
+.ds Po to the old storage or to the block of storage that is to be freed
+.IP \fIptr\fP 1i
+Specifies a pointer \*(Po.
+.IP \fIsize\fP 1i
+Specifies the size of an array element (in bytes) or the number of bytes
+desired.
+.IP \fIstring\fP 1i
+Specifies a previously declared string.
+.IP \fItype\fP 1i
+Specifies a previously declared data type.
+.IP \fInew_string\fP 1i
+Specifies a pointer to write a newly allocated string to.
+.IP \fIformat\fP 1i
+Specifies a formatting string as defined by sprintf(3c)
+.SH DESCRIPTION
+The
+.ZN XtMalloc
+functions returns a pointer to a block of storage of at least
+the specified size bytes.
+If there is insufficient memory to allocate the new block,
+.ZN XtMalloc
+calls
+.ZN XtErrorMsg .
+.LP
+The
+.ZN XtCalloc
+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,
+.ZN XtCalloc
+calls
+.ZN XtErrorMsg .
+.LP
+The
+.ZN XtRealloc
+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,
+.ZN XtRealloc
+calls
+.ZN XtErrorMsg .
+If ptr is NULL,
+.ZN XtRealloc
+allocates the new storage without copying the old contents;
+that is, it simply calls
+.ZN XtMalloc .
+.LP
+The
+.ZN XtFree
+function returns storage and allows it to be reused.
+If ptr is NULL,
+.ZN XtFree
+returns immediately.
+.LP
+.ZN XtNew
+returns a pointer to the allocated storage.
+If there is insufficient memory to allocate the new block,
+.ZN XtNew
+calls
+.ZN XtErrorMsg .
+.ZN XtNew
+is a convenience macro that calls
+.ZN XtMalloc
+with the following arguments specified:
+.LP
+.Ds
+.TA .5i
+.ta .5i
+((type *) XtMalloc((unsigned) sizeof(type))
+.De
+.LP
+.ZN XtNewString
+returns a pointer to the allocated storage.
+If there is insufficient memory to allocate the new block,
+.ZN XtNewString
+calls
+.ZN XtErrorMsg .
+.ZN XtNewString
+is a convenience macro that calls
+.ZN XtMalloc
+with the following arguments specified:
+.LP
+.Ds
+.TA .5i
+.ta .5i
+(strcpy(XtMalloc((unsigned) strlen(str) + 1), str))
+.De
+.LP
+The
+.ZN XtAsprintf
+function allocates space for a string large enough to hold the string
+specified by the sprintf(3c) format pattern when used with the remaining
+arguments, and fills it with the formatted results.
+The address of the allocated string is placed into the pointer passed as ret.
+The length of the string (not including the terminating null byte) is returned.
+If there is insufficient memory to allocate the new block,
+.ZN XtAsprintf
+calls
+.ZN XtErrorMsg .
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtManageChild.man b/man/XtManageChild.man
new file mode 100644 (file)
index 0000000..98b4bb6
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtManageChildren.__libmansuffix__
diff --git a/man/XtManageChildren.man b/man/XtManageChildren.man
new file mode 100644 (file)
index 0000000..2a2c80f
--- /dev/null
@@ -0,0 +1,349 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtManage-Children XtManage-Child XtUnmanage-Children XtUnmanage-Child XtChange-ManagedSet XtIs-Managed wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtManageChildren __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtManageChildren, XtManageChild, XtUnmanageChildren, XtUnmanageChild, XtChangeManagedSet, XtIsManaged \- manage and unmanage children
+.SH SYNTAX
+typedef Widget *WidgetList;
+.HP
+void XtManageChildren(WidgetList \fIchildren\fP, Cardinal \fInum_children\fP);
+.HP
+void XtManageChild(Widget \fIchild\fP);
+.HP
+void XtUnmanageChildren(WidgetList \fIchildren\fP, Cardinal
+\fInum_children\fP);
+.HP
+void XtUnmanageChild(Widget \fIchild\fP);
+.HP
+void XtChangeManagedSet(WidgetList \fIunmanage_children\fP,
+Cardinal \fInum_unmanage_children\fP, XtDoChangeProc \fIdo_change_proc\fP,
+XtPointer \fIclient_data\fP, WidgetList \fImanage_children\fP,
+Cardinal \fInum_manage_children\fP);
+.HP
+Boolean XtIsManaged(Widget \fIwidget\fP);
+.SH ARGUMENTS
+.IP \fIchild\fP 1i
+Specifies the child.
+.IP \fIchildren\fP 1i
+Specifies a list of child widgets.
+.IP \fInum_children\fP 1i
+Specifies the number of children.
+.IP \fIwidget\fP 1i
+Specifies the widget.
+.IP \fImanage_children\fP 1i
+Specifies the list of widget children to add to the managed set.
+.IP \fInum_manage_children\fP 1i
+Specifies the number of entries in the manage_children list.
+.IP \fIunmanage_children\fP 1i
+Specifies the list of widget children to remove from the managed set.
+.IP \fInum_unmanage_children\fP 1i
+Specifies the number of entries in the unmanage_children list.
+.IP \fIdo_change_proc\fP 1i
+Specifies the post unmanage, pre manage hook procedure to invoke.
+.IP \fIclient_data\fP 1i
+Specifies the client data to be passed to the hook procedure.
+.SH DESCRIPTION
+The
+.ZN XtManageChildren
+function performs the following:
+.IP \(bu 5
+Issues an error if the children do not all have the same parent or
+if the parent is not a subclass of
+.ZN compositeWidgetClass .
+.IP \(bu 5
+Returns immediately if the common parent is being destroyed;
+otherwise, for each unique child on the list,
+.ZN XtManageChildren
+ignores the child if it already is managed or is being destroyed
+and marks it if not.
+.IP \(bu 5
+If the parent is realized and after all children have been marked,
+it makes some of the newly managed children viewable:
+.RS
+.IP \- 5
+Calls the change_managed routine of the widgets' parent.
+.IP \- 5
+Calls
+.ZN XtRealizeWidget
+on each previously unmanaged child that is unrealized.
+.IP \- 5
+Maps each previously unmanaged child that has map_when_managed
+.ZN True .
+.RE
+.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 managed field is
+.ZN True
+and should ignore all other children.
+Note that some composite widgets, especially fixed boxes, call
+.ZN XtManageChild
+from their insert_child procedure.
+.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
+.ZN XtMoveWidget ,
+which first updates the x and y fields and then calls
+.ZN XMoveWindow
+if the widget is realized.
+.LP
+The
+.ZN XtManageChild
+function constructs a
+.ZN WidgetList
+of length one and calls
+.ZN XtManageChildren .
+.LP
+The
+.ZN XtUnmanageChildren
+function performs the following:
+.IP \(bu 5
+Issues an error if the children do not all have the same parent
+or if the parent is not a subclass of
+.ZN compositeWidgetClass .
+.IP \(bu 5
+Returns immediately if the common parent is being destroyed;
+otherwise, for each unique child on the list,
+.ZN XtUnmanageChildren
+performs the following:
+.RS
+.IP \- 5
+Ignores the child if it already is unmanaged or is being destroyed
+and marks it if not.
+.IP \- 5
+If the child is realized,
+it makes it nonvisible by unmapping it.
+.RE
+.IP \(bu 5
+Calls the change_managed routine of the widgets' parent
+after all children have been marked
+if the parent is realized.
+.LP
+.ZN XtUnmanageChildren
+does not destroy the children widgets.
+Removing widgets from a parent's managed set is often a temporary banishment,
+and, some time later, you may manage the children again.
+.LP
+The
+.ZN XtUnmanageChild
+function constructs a widget list
+of length one and calls
+.ZN XtUnmanageChildren .
+.LP
+The
+.ZN XtChangeManagedSet
+function performs the following:
+.IP \(bu 5
+Issues an error if the widgets specified in the \fImanage_children\fP
+and the \fIunmanage_children\fP lists to no all have the same parent, or
+if that parent is not a subclass of compositeWidgetClass.
+.IP \(bu 5
+Returns immediately if the common parent is being destroyed.
+.IP \(bu 5
+If no
+.ZN CompositeClassExtension
+is defined, or a
+.ZN CompositeClassExtension
+is defined but with an \fIallows_change_managed_set\fP field with a
+value of
+.ZN False ,
+and
+.ZN XtChangeManagedSet
+was invoked with a non-NULL \fIdo_change_proc\fP procedure
+then
+.ZN XtChangeManagedSet
+performs the following:
+.RS
+.IP \- 5
+Calls
+.ZN XtUnmanageChildren
+(\fIunmanage_children\fP, \fInum_unmanage_children\fP).
+.IP \- 5
+Calls the \fIdo_change_proc\fP specified.
+.IP \- 5
+Calls
+.ZN XtManageChildren
+(\fImanage_children\fP, \fInum_manage_children\fP) and then returns
+immediately.
+.RE
+.IP \(bu 5
+Otherwise, if a
+.ZN CompositeClassExtension
+is defined with an \fIallows_change_managed_set\fP field with a value of
+.ZN True ,
+or if no
+.ZN CompositeClassExtension
+is defined, and
+.ZN XtChangeManagedSet was invoked with a NULL
+\fIdo_change_proc\fP procedure, then the following is
+performed:
+.RS
+.IP \- 5
+For each child on the \fIunmanage_children\fP list; if the child is
+already unmanaged or is being destroyed it is ignored, otherwise it
+is marked as being unmanaged and if it is realized it is made nonvisible
+by being unmapped.
+.IP \- 5
+If the \fIdo_change_proc\fP procedure is non-NULL then
+it is invoked as specified.
+.IP \- 5
+For each child on the \fImanage_children\fP list; if the child is
+already managed or it is being destroyed it is ignored, otherwise it
+is marked as managed
+.RE
+.IP \(bu 5
+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:
+.RS
+.IP \- 5
+Calling
+.ZN XtRealizeWidget
+on each of the previously unmanaged child that is unrealized.
+.IP \- 5
+Mapping each previously unmanaged child that has \fImap_when_managed\fP
+.ZN True .
+.RE
+.LP
+The
+.ZN XtIsManaged
+function returns
+.ZN True
+if the specified widget is of class RectObj or any subclass thereof and
+is managed, or
+.ZN False
+otherwise.
+.SH "SEE ALSO"
+XtMapWidget(__libmansuffix__),
+XtRealizeWidget(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtMapWidget.man b/man/XtMapWidget.man
new file mode 100644 (file)
index 0000000..6acb45d
--- /dev/null
@@ -0,0 +1,172 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtMap-Widget XtSet-Mapped-When-Managed XtUnmap-Widget wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtMapWidget __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtMapWidget, XtSetMappedWhenManaged, XtUnmapWidget \- map and unmap widgets
+.SH SYNTAX
+.HP
+int XtMapWidget(Widget \fIw\fP\^);
+.HP
+void XtSetMappedWhenManaged(Widget \fIw\fP, Boolean \fImap_when_managed\fP);
+.HP
+int XtUnmapWidget(Widget \fIw\fP\^);
+.SH ARGUMENTS
+.IP \fImap_when_managed\fP 1i
+Specifies a Boolean value that indicates the new value of the map_when_managed
+field.
+.IP \fIw\fP 1i
+Specifies the widget.
+.SH DESCRIPTION
+If the widget is realized and managed
+and if the new value of map_when_managed is
+.ZN True ,
+.ZN XtSetMappedWhenManaged
+maps the window.
+If the widget is realized and managed
+and if the new value of map_when_managed is
+.ZN False ,
+it unmaps the window.
+.ZN XtSetMappedWhenManaged
+is a convenience function that is equivalent to (but slightly faster than)
+calling
+.ZN XtSetValues
+and setting the new value for the mappedWhenManaged resource.
+As an alternative to using
+.ZN XtSetMappedWhenManaged
+to control mapping,
+a client may set mapped_when_managed to
+.ZN False
+and use
+.ZN XtMapWidget
+and
+.ZN XtUnmapWidget
+explicitly.
+.SH "SEE ALSO"
+XtManageChildren(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtMergeArgLists.man b/man/XtMergeArgLists.man
new file mode 100644 (file)
index 0000000..7a9296a
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtSetArg.__libmansuffix__
diff --git a/man/XtMoveWidget.man b/man/XtMoveWidget.man
new file mode 100644 (file)
index 0000000..172b53b
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtConfigureWidget.__libmansuffix__
diff --git a/man/XtName.man b/man/XtName.man
new file mode 100644 (file)
index 0000000..d52b435
--- /dev/null
@@ -0,0 +1,141 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtName __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtName \- obtain widget's name
+.SH SYNTAX
+.HP
+String XtName(Widget \fIw\fP);
+.SH ARGUMENTS
+.IP \fIw\fP 1i
+Specifies the widget.
+.SH DESCRIPTION
+.ZN XtName
+returns the widget's name.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtNameToWidget.man b/man/XtNameToWidget.man
new file mode 100644 (file)
index 0000000..574b279
--- /dev/null
@@ -0,0 +1,183 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtName-To-Widget XtWindow-To-Widget wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtNameToWidget __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtNameToWidget, XtWindowToWidget \- translating strings to widgets or widgets to windows
+.SH SYNTAX
+.HP
+Widget XtNameToWidget(Widget \fIreference\fP, String \fInames\fP);
+.HP
+Widget XtWindowToWidget(Display *\fIdisplay\fP, Window \fIwindow\fP);
+.SH ARGUMENTS
+.ds Di \ on which the window is defined
+.IP \fIdisplay\fP 1i
+Specifies the display\*(Di.
+.IP \fInames\fP 1i
+Specifies the fully qualified name of the desired widget.
+.IP \fIreference\fP 1i
+Specifies the widget from which the search is to start.
+.IP \fIwindow\fP 1i
+Specify the window for which you want the widget.
+.SH DESCRIPTION
+The
+.ZN XtNameToWidget
+function looks for a widget whose name is the first component in the specified
+names and that is a pop-up child of reference (or a normal child if reference
+is a subclass of
+.ZN compositeWidgetClass ).
+It then uses that widget as the new reference and repeats the search
+after deleting the first component from the specified names.
+If it cannot find the specified widget,
+.ZN XtNameToWidget
+returns NULL.
+.LP
+Note that the names argument contains the name of a widget with respect to the
+specified reference widget and can contain more than one widget name
+(separated by periods) for widgets that are not direct children
+of the specified reference widget.
+.LP
+If more than one child of the reference widget matches the name,
+.ZN XtNameToWidget
+can return any of the children.
+The \*(xI do not require that all children of a widget have unique names.
+If the specified names contain more than one component
+and if more than one child matches the first component,
+.ZN XtNameToWidget
+can return NULL if the single branch that it follows does not
+contain the named widget.
+That is,
+.ZN XtNameToWidget
+does not back up and follow other matching branches of the widget tree.
+.LP
+The
+.ZN XtWindowToWidget
+function translates the specified window and display pointer into the
+appropriate widget instance.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtNew.man b/man/XtNew.man
new file mode 100644 (file)
index 0000000..50eaf76
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtMalloc.__libmansuffix__
diff --git a/man/XtNewString.man b/man/XtNewString.man
new file mode 100644 (file)
index 0000000..50eaf76
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtMalloc.__libmansuffix__
diff --git a/man/XtNextEvent.man b/man/XtNextEvent.man
new file mode 100644 (file)
index 0000000..b174214
--- /dev/null
@@ -0,0 +1,183 @@
+.\" Copyright (c) 1993, 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 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 dealing in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtNext-Event XtPeek-Event XtProcess-Event XtMain-Loop wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtNextEvent __libmansuffix__ __xorgversion__ "XT COMPATIBILITY FUNCTIONS"
+.SH NAME
+XtNextEvent, XtPending, XtPeekEvent, XtProcessEvent, XtMainLoop \- query and process events and input
+.SH SYNTAX
+.HP
+void XtNextEvent(XEvent *\fIevent_return\fP);
+.HP
+Boolean XtPeekEvent(XEvent *\fIevent_return\fP);
+.HP
+Boolean XtPending(void);
+.HP
+void XtProcessEvent(XtInputMask \fImask\fP);
+.HP
+void XtMainLoop(void);
+.SH ARGUMENTS
+.IP \fIevent\fP 1i
+Specifies a pointer to the event structure that is to be dispatched
+to the appropriate event handler.
+.IP \fIevent_return\fP 1i
+Returns the event information to the specified event structure.
+.IP \fImask\fP 1i
+Specifies what types of events to process.
+The mask is the bitwise inclusive OR of any combination of
+.ZN XtIMXEvent ,
+.ZN XtIMTimer ,
+.ZN XtIMAlternateInput ,
+and
+.ZN XtIMSignal .
+As a convenience, the \*(tk defines the symbolic name
+.ZN XtIMAll
+to be the bitwise inclusive OR of all event types.
+.SH DESCRIPTION
+.ZN XtNextEvent
+has been replaced by
+.ZN XtAppNextEvent .
+.LP
+.ZN XtPeekEvent
+has been replaced by
+.ZN XtAppPeekEvent .
+.LP
+.ZN XtPending
+has been replaced by
+.ZN XtAppPending .
+.LP
+.ZN XtProcessEvent
+has been replaced by
+.ZN XtAppProcessEvent .
+.LP
+.ZN XtMainLoop
+has been replaced by
+.ZN XtAppMainLoop .
+.SH "SEE ALSO"
+XtAppNextEvent(3xt), XtAppPending(__libmansuffix__), XtAppPeekEvent(__libmansuffix__),
+XtAppProcessEvent(__libmansuffix__), XtAppMainLoop(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtNoticeSignal.man b/man/XtNoticeSignal.man
new file mode 100644 (file)
index 0000000..b06beef
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAppAddSignal.__libmansuffix__
diff --git a/man/XtNumber.man b/man/XtNumber.man
new file mode 100644 (file)
index 0000000..2e725f3
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtOffset.__libmansuffix__
diff --git a/man/XtOffset.man b/man/XtOffset.man
new file mode 100644 (file)
index 0000000..f18594c
--- /dev/null
@@ -0,0 +1,170 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtOffset __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtOffset, XtOffsetOf, XtNumber \- determine the byte offset or number of array elements
+.SH SYNTAX
+.HP
+Cardinal XtOffset(Type \fIpointer_type\fP, Field \fIfield_name\fP);
+.HP
+Cardinal XtOffsetOf(Type \fIstructure_type\fP, Field \fIfield_name\fP);
+.HP
+Cardinal XtNumber(ArrayVariable \fIarray\fP);
+.SH ARGUMENTS
+.IP \fIarray\fP 1i
+Specifies a fixed-size array.
+.IP \fIfield_name\fP 1i
+Specifies the name of the field for which to calculate the byte offset.
+.IP \fIpointer_type\fP 1i
+Specifies a type that is declared as a pointer to the structure.
+.IP \fIstructure_type\fP 1i
+Specifies a type that is declared as a structure.
+.SH DESCRIPTION
+The
+.ZN XtOffset
+macro is usually used to determine the offset of various resource fields
+from the beginning of a widget and can be used at compile time in static
+initializations.
+.LP
+The
+.ZN XtOffsetOf
+macro expands to a constant expression that gives the offset in bytes
+to the specified structure member from the beginning of the structure.
+It is normally used to statically initialize resource lists and is more
+portable than
+.ZN XtOffset ,
+which serves the same function.
+.LP
+The
+.ZN XtNumber
+macro returns the number of elements in the specified argument lists,
+resources lists, and other counted arrays.
+.SH "SEE ALSO"
+XtGetResourceList(__libmansuffix__),
+XtSetArg(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtOffsetOf.man b/man/XtOffsetOf.man
new file mode 100644 (file)
index 0000000..2e725f3
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtOffset.__libmansuffix__
diff --git a/man/XtOpenApplication.man b/man/XtOpenApplication.man
new file mode 100644 (file)
index 0000000..379f5e2
--- /dev/null
@@ -0,0 +1,207 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtOpen-Application XtVa-Open-Application
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtOpenApplication __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtOpenApplication, XtVaOpenApplication \- initialize, open, or close a display
+.SH SYNTAX
+.HP
+Widget XtOpenApplication(XtAppContext *\fIapp_context_return\fP, String
+\fIapplication_class\fP, XrmOptionDescRec *\fIoptions\fP, Cardinal
+\fInum_options\fP, int *\fIargc_in_out\fP, String *\fIargv_in_out\fP, String
+*\fIfallback_resources\fP, WidgetClass \fIwidget_class\fP, ArgList \fIargs\fP,
+Cardinal \fInum_args\fP);
+.HP
+Widget XtVaOpenApplication(XtAppContext *\fIapp_context_return\fP, String
+\fIapplication_class\fP, XrmOptionDescRec *\fIoptions\fP, Cardinal
+\fInum_options\fP, int *\fIargc_in_out\fP, String *\fIargv_in_out\fP, String
+*\fIfallback_resources\fP, WidgetClass \fIwidget_class\fP, ...\^);
+.SH ARGUMENTS
+.IP \fIapp_context_return\fP 1i
+Specifies the application context.
+.ds Ac , which usually is the generic name for all instances of this application
+.IP \fIapplication_class\fP 1i
+Specifies the class name of this application\*(Ac.
+.IP \fIoptions\fP 1i
+Specifies how to parse the command line for any application-specific resources.
+The options argument is passed as a parameter to
+.ZN XrmParseCommand .
+For further information,
+see \fI\*(xL\fP.
+.IP \fInum_options\fP 1i
+Specifies the number of entries in the options list.
+.IP \fIargc_in_out\fP 1i
+Specifies a pointer to the number of command line parameters.
+.IP \fIargv_in_out\fP 1i
+Specifies the command line parameters.
+.IP \fIfallback_resources\fP 1i
+Specifies resource values to be used if the application class resource
+file cannot be opened or read, or NULL.
+.IP \fIwidget_class\fP 1i
+Specifies the widget class of the shell to be created.
+.IP \fIargs\fP 1i
+Specifies the argument list to override any other resource specification
+for the created shell widget.
+.IP \fInum_args\fP 1i
+Specifies the number of entries in the argument list.
+.IP \fI...\fP 1i
+Specifies the variable argument list to override any other resource
+specification for the created shell widget.
+.SH DESCRIPTION
+The
+.ZN XtOpenApplication
+function calls
+.ZN XtToolkitInitialize
+followed by
+.ZN XtCreateApplicationContext ,
+then calls
+.ZN XtOpenDisplay
+with \fIdisplay_string\fP NULL and \fIapplication_name\fP NULL, and
+finally calls
+.ZN XtAppCreateShell
+with \fIapplication_name\fP NULL, the specified \fIwidget_class\fP,
+and the specified \fIargs\fP and \fInum_args\fP and returns the
+created shell. The modified \fIargc\fP and \fIargv\fP returned by
+.ZN XtDisplayInitialize
+are returned in \fIargc_in_out\fP and \fIargv_in_out\fP. If
+\fIapp_context_return\fP is not NULL, the created application context
+is also returned. If the display specified by the command line cannot
+be opened, an error message is issued and
+.ZN XtOpenApplication
+terminates the application. If \fIfallback_resources\fP is non-NULL,
+.ZN XtAppSetFallbackResources
+is called with the value prior to calling
+.ZN XtOpenDisplay .
+.LP
+XtAppInitialize and XtVaAppInitialize have been superceded by
+.ZN XtOpenApplication
+and
+.ZN XtVaOpenApplication
+respectively.
+.SH "SEE ALSO"
+XtAppInitialize(__libmansuffix__), XtVaAppInitialize(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtOpenDisplay.man b/man/XtOpenDisplay.man
new file mode 100644 (file)
index 0000000..0a0994c
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtDisplayInitialize.__libmansuffix__
diff --git a/man/XtOverrideTranslations.man b/man/XtOverrideTranslations.man
new file mode 100644 (file)
index 0000000..4f4cdde
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtParseTranslationTable.__libmansuffix__
diff --git a/man/XtOwnSelection.man b/man/XtOwnSelection.man
new file mode 100644 (file)
index 0000000..58a37d3
--- /dev/null
@@ -0,0 +1,226 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtOwn-Selection XtOwn-Selection-Incremental XtDisown-Selection wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtOwnSelection __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtOwnSelection, XtOwnSelectionIncremental, XtDisownSelection \- set selection owner
+.SH SYNTAX
+.HP
+Boolean XtOwnSelection(Widget \fIw\fP, Atom \fIselection\fP, Time \fItime\fP,
+XtConvertSelectionProc \fIconvert_proc\fP, XtLoseSelectionProc
+\fIlose_selection\fP, XtSelectionDoneProc \fIdone_proc\fP);
+.HP
+Boolean XtOwnSelectionIncremental(Widget \fIw\fP, Atom \fIselection\fP, Time
+\fItime\fP, XtConvertSelectionIncrProc \fIconvert_callback\fP,
+XtLoseSelectionIncrProc \fIlose_callback\fP, XtSelectionDoneIncrProc
+\fIdone_callback\fP, XtCancelConvertSelectionProc \fIcancel_callback\fP,
+XtPointer \fIclient_data\fP);
+.HP
+void XtDisownSelection(Widget \fIw\fP, Atom \fIselection\fP, Time \fItime\fP);
+.SH ARGUMENTS
+.IP \fIconvert_proc\fP 1i
+Specifies the procedure that is to be called whenever someone requests the
+current value of the selection.
+.IP \fIdone_proc\fP 1i
+Specifies the procedure that is called
+after the requestor has received the selection or NULL if the owner is not
+interested in being called back.
+.IP \fIlose_selection\fP 1i
+Specifies the procedure that is to be called whenever the widget has
+lost selection ownership or NULL if the owner is not interested in being
+called back.
+.IP \fIselection\fP 1i
+Specifies an atom that describes the type of the selection (for example,
+.ZN XA_PRIMARY ,
+.ZN XA_SECONDARY ,
+or
+.ZN XA_CLIPBOARD ).
+.ds Ti ownership should commence or is to be relinquished
+.IP \fItime\fP 1i
+Specifies the timestamp that indicates when the selection \*(Ti.
+.ds Wi that wishes to become the owner or to relinquish ownership
+.IP \fIw\fP 1i
+Specifies the widget \*(Wi.
+.SH DESCRIPTION
+The
+.ZN XtOwnSelection
+function informs the \*(xI selection mechanism that a
+widget believes it owns a selection.
+It returns
+.ZN True
+if the widget has successfully become the owner and
+.ZN False
+otherwise.
+The widget may fail to become the owner if some other widget
+has asserted ownership at a time later than this widget.
+Note that widgets can lose selection ownership either
+because someone else asserted later ownership of the selection
+or because the widget voluntarily gave up ownership of the selection.
+Also note that the lose_selection procedure is not called
+if the widget fails to obtain selection ownership in the first place.
+.LP
+The
+.ZN XtOwnSelectionIncremental
+procedure informs the Intrinsics incremental selection mechanism that
+the specified widget wishes to own the selection. It returns
+.ZN True
+if the specified widget successfully becomes the selection owner or
+.ZN False
+otherwise. For more information about \fIselection\fP, \fItarget\fP,
+and \fItime\fP, see Section 2.6 of the \fIInter-Client Communication
+Conventions Manual\fP.
+.LP
+A widget that becomes the selection owner using
+.ZN XtOwnSelectionIncremental
+may use
+.ZN XtDisownSelection
+to relinquish selection ownership.
+.LP
+The
+.ZN XtDisownSelection
+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,
+.ZN XtDisownSelection
+does nothing.
+.LP
+After a widget has called
+.ZN XtDisownSelection ,
+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 will be called if a conversion that started
+before the call to
+.ZN XtDisownSelection
+finishes after the call to
+.ZN XtDisownSelection .
+.SH "SEE ALSO"
+XtAppGetSelectionTimeout(__libmansuffix__),
+XtGetSelectionValue(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtOwnSelectionIncremental.man b/man/XtOwnSelectionIncremental.man
new file mode 100644 (file)
index 0000000..bda68eb
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtOwnSelection.__libmansuffix__
diff --git a/man/XtParent.man b/man/XtParent.man
new file mode 100644 (file)
index 0000000..bdca5b2
--- /dev/null
@@ -0,0 +1,142 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtParent __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtParent \- obtain widget's parent widget id
+.SH SYNTAX
+.HP
+Widget XtParent(Widget \fIw\fP);
+.SH ARGUMENTS
+.IP \fIw\fP 1i
+Specifies the widget.
+.SH DESCRIPTION
+.ZN XtParent
+returns the widget's parent widget ID.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtParseAcceleratorTable.man b/man/XtParseAcceleratorTable.man
new file mode 100644 (file)
index 0000000..7083e0e
--- /dev/null
@@ -0,0 +1,175 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtParse-Accelerator-Table XtInstall-Accelerators XtInstall-All-Accelerators wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtParseAcceleratorTable __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtParseAcceleratorTable, XtInstallAccelerators, XtInstallAllAccelerators \- managing accelerator tables
+.SH SYNTAX
+.HP
+XtAccelerators XtParseAcceleratorTable(String \fIsource\fP);
+.HP
+void XtInstallAccelerators(Widget \fIdestination\fP, Widget \fIsource\fP);
+.HP
+void XtInstallAllAccelerators(Widget \fIdestination\fP, Widget \fIsource\fP);
+.SH ARGUMENTS
+.ds So to compile
+.IP \fIsource\fP 1i
+Specifies the accelerator table \*(So.
+.IP \fIdestination\fP 1i
+Specifies the widget on which the accelerators are to be installed.
+.ds Sr widget or the root widget of the widget tree
+.IP \fIsource\fP 1i
+Specifies the \*(Sr from which the accelerators are to come.
+.SH DESCRIPTION
+The
+.ZN XtParseAcceleratorTable
+function compiles the accelerator table into the opaque internal representation.
+.LP
+The
+.ZN XtInstallAccelerators
+function installs the accelerators from source onto destination
+by augmenting the destination translations with the source accelerators.
+If the source display_accelerator method is non-NULL,
+.ZN XtInstallAccelerators
+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.
+.LP
+The
+.ZN XtInstallAllAccelerators
+function recursively descends the widget tree rooted at source
+and installs the accelerators of each widget encountered onto destination.
+A common use os to call
+.ZN XtInstallAllAccelerators
+and pass the application main window as the source.
+.SH "SEE ALSO"
+XtParseTranslationTable(1)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtParseTranslationTable.man b/man/XtParseTranslationTable.man
new file mode 100644 (file)
index 0000000..bde1d70
--- /dev/null
@@ -0,0 +1,190 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtParse-Translation-Table XtAugment-Translations XtOverride-Translations XtUninstall-Translations wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtParseTranslationTable __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtParseTranslationTable, XtAugmentTranslations, XtOverrideTranslations, XtUninstallTranslations \- manage translation tables
+.SH SYNTAX
+.HP
+XtTranslations XtParseTranslationTable(String \fItable\fP);
+.HP
+void XtAugmentTranslations(Widget \fIw\fP, XtTranslations \fItranslations\fP);
+.HP
+void XtOverrideTranslations(Widget \fIw\fP, XtTranslations
+\fItranslations\fP);
+.HP
+void XtUninstallTranslations(Widget \fIw\fP);
+.SH ARGUMENTS
+.IP \fItable\fP 1i
+Specifies the translation table to compile.
+.IP \fItranslations\fP 1i
+Specifies the compiled translation table to merge in (must not be NULL).
+.ds Wi into which the new translations are to be merged or removed
+.IP \fIw\fP 1i
+Specifies the widget \*(Wi.
+.SH DESCRIPTION
+The
+.ZN XtParseTranslationTable
+function compiles the translation table into the opaque internal representation
+of type
+.ZN XtTranslations .
+Note that if an empty translation table is required for any purpose,
+one can be obtained by calling
+.ZN XtParseTranslationTable
+and passing an empty string.
+.LP
+The
+.ZN XtAugmentTranslations
+function nondestructively merges the new translations into the existing widget
+translations.
+If the new translations contain an event or event sequence that
+already exists in the widget's translations,
+the new translation is ignored.
+.LP
+The
+.ZN XtOverrideTranslations
+function destructively merges the new translations into the existing widget
+translations.
+If the new translations contain an event or event sequence that
+already exists in the widget's translations,
+the new translation is merged in and override the widget's translation.
+.LP
+To replace a widget's translations completely, use
+.ZN XtSetValues
+on the XtNtranslations resource and specify a compiled translation table
+as the value.
+.LP
+The
+.ZN XtUninstallTranslations
+function causes the entire translation table for widget to be removed.
+.SH "SEE ALSO"
+XtAppAddActions(__libmansuffix__),
+XtCreatePopupShell(__libmansuffix__),
+XtParseAcceleratorTable(__libmansuffix__),
+XtPopup(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtPeekEvent.man b/man/XtPeekEvent.man
new file mode 100644 (file)
index 0000000..f049c5b
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtNextEvent.__libmansuffix__
diff --git a/man/XtPending.man b/man/XtPending.man
new file mode 100644 (file)
index 0000000..f049c5b
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtNextEvent.__libmansuffix__
diff --git a/man/XtPopdown.man b/man/XtPopdown.man
new file mode 100644 (file)
index 0000000..85c5073
--- /dev/null
@@ -0,0 +1,231 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtCallback-Popdown wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtPopdown __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtPopdown, XtCallbackPopdown \- unmap a pop-up
+.SH SYNTAX
+.HP
+void XtPopdown(Widget \fIpopup_shell\fP);
+.HP
+void XtCallbackPopdown(Widget \fIw\fP, XtPointer \fIclient_data\fP, XtPointer
+\fIcall_data\fP);
+.HP
+void MenuPopdown(String \fIshell_name\fP);
+.SH ARGUMENTS
+.IP \fIcall_data\fP 1i
+Specifies the callback data,
+which is not used by this procedure.
+.IP \fIclient_data\fP 1i
+Specifies a pointer to the
+.ZN XtPopdownID
+structure.
+.ds Ps \ to pop down
+.IP \fIpopup_shell\fP 1i
+Specifies the widget shell\*(Ps.
+.ds Sn down
+.IP \fIshell_name\fP 1i
+Specifies the name of the widget shell to pop \*(Sn.
+.IP \fIw\fP 1i
+Specifies the widget.
+.SH DESCRIPTION
+The
+.ZN XtPopdown
+function performs the following:
+.IP \(bu 5
+Calls
+.ZN XtCheckSubclass
+.\".ZN XtCheckSubclass(popup_shell, popupShellWidgetClass)
+to ensure popup_shell is a subclass of
+.ZN Shell .
+.IP \(bu 5
+Checks that popup_shell is currently popped_up;
+otherwise, it generates an error.
+.IP \(bu 5
+Unmaps popup_shell's window.
+.IP \(bu 5
+If popup_shell's grab_kind is either
+.ZN XtGrabNonexclusive
+or
+.ZN XtGrabExclusive ,
+it calls
+.ZN XtRemoveGrab .
+.\".ZN XtRemoveGrab(popup_shell)
+.IP \(bu 5
+Sets pop-up shell's popped_up field to
+.ZN False .
+.IP \(bu 5
+Calls the callback procedures on the shell's popdown_callback list.
+.LP
+The
+.ZN XtCallbackPopdown
+function casts the client data parameter to an
+.ZN XtPopdownID
+pointer:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       Widget shell_widget;
+       Widget enable_widget;
+} XtPopdownIDRec, *XtPopdownID;
+.De
+The shell_widget is the pop-up shell to pop down,
+and the enable_widget is the widget that was used to pop it up.
+.LP
+.ZN XtCallbackPopdown
+calls
+.ZN XtPopdown
+with the specified shell_widget
+and then calls
+.ZN XtSetSensitive
+to resensitize the enable_widget.
+.LP
+If a shell name is not given,
+.ZN MenuPopdown
+calls
+.ZN XtPopdown
+with the widget for which the translation is specified.
+If a shell_name is specified in the translation table,
+.ZN MenuPopdown
+tries to find the shell by looking up the widget tree starting at the
+parent of the widget in which it is invoked.
+If it finds a shell with the specified name in the pop-up children
+of that parent,
+it pops down the shell;
+otherwise, it moves up the parent chain as needed.
+If
+.ZN MenuPopdown
+gets to the application top-level shell widget
+and cannot find a matching shell,
+it generates an error.
+.SH "SEE ALSO"
+XtCreatePopupShell(__libmansuffix__),
+XtPopup(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtPopup.man b/man/XtPopup.man
new file mode 100644 (file)
index 0000000..fc3d574
--- /dev/null
@@ -0,0 +1,324 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtPopup-Spring-Loaded XtCallback-None XtCallback-Nonexclusive XtCallback-Exclusive wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtPopup __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtPopup, XtPopupSpringLoaded, XtCallbackNone, XtCallbackNonexclusive, XtCallbackExclusive \- map a pop-up
+.SH SYNTAX
+.HP
+void XtPopup(Widget \fIpopup_shell\fP, XtGrabKind \fIgrab_kind\fP);
+.HP
+void XtPopupSpringLoaded(Widget \fIpopup_shell\fP);
+.HP
+void XtCallbackNone(Widget \fIw\fP, XtPointer \fIclient_data\fP, XtPointer
+\fIcall_data\fP):
+.HP
+void XtCallbackNonexclusive(Widget \fIw\fP, XtPointer \fIclient_data\fP,
+XtPointer \fIcall_data\fP);
+.HP
+void XtCallbackExclusive(Widget \fIw\fP, XtPointer \fIclient_data\fP,
+XtPointer \fIcall_data\fP);
+.HP
+void MenuPopup(String \fIshell_name\fP);
+.SH ARGUMENTS
+.IP \fIcall_data\fP 1i
+Specifies the callback data,
+which is not used by this procedure.
+.IP \fIclient_data\fP 1i
+Specifies the pop-up shell.
+.IP \fIgrab_kind\fP 1i
+Specifies the way in which user events should be constrained.
+.IP \fIpopup_shell\fP 1i
+Specifies the widget shell\*(Ps.
+.IP \fIw\fP 1i
+Specifies the widget.
+.SH DESCRIPTION
+The
+.ZN XtPopup
+function performs the following:
+.IP \(bu 5
+Calls
+.ZN XtCheckSubclass
+.\".ZN XtCheckSubclass(popup_shell, popupShellWidgetClass)
+to ensure popup_shell is a subclass of
+.ZN Shell .
+.IP \(bu 5
+Generates an error if the shell's popped_up field is already
+.ZN True .
+.IP \(bu 5
+Calls the callback procedures on the shell's popup_callback list.
+.IP \(bu 5
+Sets the shell popped_up field to
+.ZN True ,
+the shell spring_loaded field to
+.ZN False ,
+and the shell grab_kind field from grab_kind.
+.IP \(bu 5
+If the shell's create_popup_child field is non-NULL,
+.ZN XtPopup
+calls it with popup_shell as the parameter.
+.IP \(bu 5
+If grab_kind is either
+.ZN XtGrabNonexclusive
+or
+.ZN XtGrabExclusive ,
+it calls:
+.LP
+.Ds
+XtAddGrab(popup_shell, (grab_kind == XtGrabExclusive), False)
+.De
+.IP \(bu 5
+Calls
+.ZN XtRealizeWidget
+with popup_shell specified.
+.IP \(bu 5
+Calls
+.ZN XMapWindow
+with popup_shell specified.
+.LP
+The
+.ZN XtPopupSpringLoaded
+function performs exactly as
+.ZN XtPopup
+except that it sets the shell \fIspring_loaded\fP field to
+.ZN True
+and always calls
+.ZN XtAddGrab
+with \fIexclusive\fP
+.ZN True
+and \fIspring_loaded\fP
+.ZN True .
+.LP
+The
+.ZN XtCallbackNone ,
+.ZN XtCallbackNonexclusive ,
+and
+.ZN XtCallbackExclusive
+functions call
+.ZN XtPopup
+with the shell specified by the client data argument
+and grab_kind set as the name specifies.
+.ZN XtCallbackNone ,
+.ZN XtCallbackNonexclusive ,
+and
+.ZN XtCallbackExclusive
+specify
+.ZN XtGrabNone ,
+.ZN XtGrabNonexclusive ,
+and
+.ZN XtGrabExclusive ,
+respectively.
+Each function then sets the widget that executed the callback list
+to be insensitive by using
+.ZN XtSetSensitive .
+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.
+.LP
+.ZN MenuPopup
+is known to the translation manager,
+which must perform special actions for spring-loaded pop-ups.
+Calls to
+.ZN MenuPopup
+in a translation specification are mapped into calls to a
+nonexported action procedure,
+and the translation manager fills in parameters
+based on the event specified on the left-hand side of a translation.
+.LP
+If
+.ZN MenuPopup
+is invoked on
+.ZN ButtonPress
+(possibly with modifiers),
+the translation manager pops up the shell with grab_kind set to
+.ZN XtGrabExclusive
+and spring_loaded set to
+.ZN True .
+If
+.ZN MenuPopup
+is invoked on
+.ZN EnterWindow
+(possibly with modifiers),
+the translation manager pops up the shell with grab_kind set to
+.ZN XtGrabNonexclusive
+and spring_loaded set to
+.ZN False .
+Otherwise, the translation manager generates an error.
+When the widget is popped up,
+the following actions occur:
+.IP \(bu 5
+Calls
+.ZN XtCheckSubclass
+.\".ZN XtCheckSubclass(popup_shell, popupShellWidgetClass)
+to ensure popup_shell is a subclass of
+.ZN Shell .
+.IP \(bu 5
+Generates an error if the shell's popped_up field is already
+.ZN True .
+.IP \(bu 5
+Calls the callback procedures on the shell's popup_callback list.
+.IP \(bu 5
+Sets the shell popped_up field to
+.ZN True
+and the shell grab_kind and spring_loaded fields appropriately.
+.IP \(bu 5
+If the shell's create_popup_child field is non-NULL,
+it is called with popup_shell as the parameter.
+.IP \(bu 5
+Calls:
+.LP
+.Ds
+XtAddGrab(popup_shell, (grab_kind == XtGrabExclusive), spring_loaded)
+.De
+.IP \(bu 5
+Calls
+.ZN XtRealizeWidget
+with popup_shell specified.
+.IP \(bu 5
+Calls
+.ZN XMapWindow
+with popup_shell specified.
+.LP
+(Note that these actions are the same as those for
+.ZN XtPopup .)
+.ZN MenuPopup
+tries to find the shell by searching the widget tree starting at
+the parent of the widget in which it is invoked.
+If it finds a shell with the specified name in the pop-up children of
+that parent, it pops up the shell with the appropriate parameters.
+Otherwise, it moves up the parent chain as needed.
+If
+.ZN MenuPopup
+gets to the application widget and cannot find a matching shell,
+it generates an error.
+.SH "SEE ALSO"
+XtCreatePopupShell(__libmansuffix__),
+XtPopdown(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtPopupSpringLoaded.man b/man/XtPopupSpringLoaded.man
new file mode 100644 (file)
index 0000000..0267c01
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtPopup.__libmansuffix__
diff --git a/man/XtProcessEvent.man b/man/XtProcessEvent.man
new file mode 100644 (file)
index 0000000..f049c5b
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtNextEvent.__libmansuffix__
diff --git a/man/XtProcessLock.man b/man/XtProcessLock.man
new file mode 100644 (file)
index 0000000..2386f2d
--- /dev/null
@@ -0,0 +1,143 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtProcess-Lock XtProcess-Unlock wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtProcessLock __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtProcessLock, XtProcessUnlock \- lock and unlock process
+.SH SYNTAX
+.HP
+void XtProcessLock(void);
+.HP
+void XtProcessUnlock(void);
+.SH DESCRIPTION
+.ZN XtProcessLock
+is used to lock all process global data.
+.LP
+.ZN XtProcessUnlock
+unlocks the process.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtProcessUnlock.man b/man/XtProcessUnlock.man
new file mode 100644 (file)
index 0000000..81d6a15
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtProcessLock.__libmansuffix__
diff --git a/man/XtQueryGeometry.man b/man/XtQueryGeometry.man
new file mode 100644 (file)
index 0000000..8ba97ae
--- /dev/null
@@ -0,0 +1,167 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtQuery-Geometry wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtQueryGeometry __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtQueryGeometry \- query the preferred geometry of a child widget
+.SH SYNTAX
+.HP
+XtGeometryResult XtQueryGeometry(Widget \fIw\fP\^, XtWidgetGeometry
+*\fIintended\fP, XtWidgetGeometry *\fIpreferred_return\fP\^);
+.SH ARGUMENTS
+.IP \fIintended\fP 1i
+Specifies any changes the parent plans to make to the child's geometry or
+NULL.
+.IP \fIpreferred_return\fP 1i
+Returns the child widget's preferred geometry.
+.IP \fIw\fP 1i
+Specifies the widget.
+.SH DESCRIPTION
+To discover a child's preferred geometry,
+the child's parent sets any changes
+that it intends to make to the child's geometry in the corresponding fields of
+the intended structure, sets the corresponding bits in intended.request_mode,
+and calls
+.ZN XtQueryGeometry .
+.LP
+.ZN XtQueryGeometry
+clears all bits in the preferred_return->request_mode and checks the
+query_geometry field of the specified widget's class record.
+If query_geometry is not NULL,
+.ZN XtQueryGeometry
+calls the query_geometry procedure and passes as arguments the
+specified widget, intended, and preferred_return structures.
+If the intended argument is NULL,
+.ZN XtQueryGeometry
+replaces it with a pointer to an
+.ZN XtWidgetGeometry
+structure with request_mode=0 before calling query_geometry.
+.SH "SEE ALSO"
+XtConfigureWidget(__libmansuffix__),
+XtMakeGeometryRequest(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtRealizeWidget.man b/man/XtRealizeWidget.man
new file mode 100644 (file)
index 0000000..b686c7c
--- /dev/null
@@ -0,0 +1,211 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtRealize-Widget XtIs-Realized XtUnrealize-Widget wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtRealizeWidget __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtRealizeWidget, XtIsRealized, XtUnrealizeWidget \- realize and unrealize widgets
+.SH SYNTAX
+.HP
+void XtRealizeWidget(Widget \fIw\fP);
+.HP
+Boolean XtIsRealized(Widget \fIw\fP);
+.HP
+void XtUnrealizeWidget(Widget \fIw\fP);
+.SH ARGUMENTS
+.IP \fIw\fP 1i
+Specifies the widget.
+.SH DESCRIPTION
+If the widget is already realized,
+.ZN XtRealizeWidget
+simply returns.
+Otherwise, it performs the following:
+.IP \(bu 5
+Binds all action names in the widget's
+translation table to procedures (see Section 10.1.2).
+.IP \(bu 5
+Makes a post-order traversal of the widget tree rooted
+at the specified widget and calls the change_managed procedure
+of each composite widget that has one or more managed children.
+.IP \(bu 5
+Constructs an
+.ZN XSetWindowAttributes
+structure filled in with information derived from the
+.ZN Core
+widget fields and calls the realize procedure for the widget,
+which adds any widget-specific attributes and creates the X window.
+.IP \(bu 5
+If the widget is
+not a subclass of
+.ZN compositeWidgetClass ,
+.ZN XtRealizeWidget
+returns; otherwise, it continues and performs the following:
+.RS
+.IP \- 5
+Descends recursively to each of the widget's
+managed children and calls the realize procedures.
+Primitive widgets that instantiate children are responsible for realizing
+those children themselves.
+.IP \- 5
+Maps all of the managed children windows that have mapped_when_managed
+.ZN True .
+(If a widget is managed but mapped_when_managed is
+.ZN False ,
+the widget is allocated visual space but is not displayed.
+Some people seem to like this to indicate certain states.)
+.RE
+.LP
+If the widget is a top-level shell widget (that is, it has no parent), and
+mapped_when_managed is
+.ZN True ,
+.ZN XtRealizeWidget
+maps the widget window.
+.LP
+The
+.ZN XtIsRealized
+function returns
+.ZN True
+if the widget has been realized,
+that is, if the widget has a nonzero X window ID.
+.LP
+Some widget procedures (for example, set_values) might wish to
+operate differently
+after the widget has been realized.
+.LP
+The
+.ZN XtUnrealizeWidget
+function destroys the windows of an existing widget and all of its
+children (recursively down the widget tree).
+To recreate the windows at a later time,
+call
+.ZN XtRealizeWidget
+again.
+If the widget was managed,
+it will be unmanaged automatically before its window is freed.
+.SH "SEE ALSO"
+XtManageChildren(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtRealloc.man b/man/XtRealloc.man
new file mode 100644 (file)
index 0000000..50eaf76
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtMalloc.__libmansuffix__
diff --git a/man/XtRegisterCaseConverter.man b/man/XtRegisterCaseConverter.man
new file mode 100644 (file)
index 0000000..db83837
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtSetKeyTranslator.__libmansuffix__
diff --git a/man/XtRegisterDrawable.man b/man/XtRegisterDrawable.man
new file mode 100644 (file)
index 0000000..747c078
--- /dev/null
@@ -0,0 +1,169 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtRegister-Drawable XtUnregister-Drawable XtWindow-To-Widget wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtRegisterDrawable __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtRegisterDrawable \- register a drawable with the Intrinsics event dispatcher
+.SH SYNTAX
+.HP
+void XtRegisterDrawable(Display* \fIdisplay\fP, Drawable \fIdrawable\fP,
+Widget \fIwidget\fP);
+.HP
+void XtUnregisterDrawable(Display* \fIdisplay\fP, Drawable \fIdrawable\fP);
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the drawable's display.
+.IP \fIdrawable\fP 1i
+Specifies the drawable to register.
+.IP \fIwidget\fP 1i
+Specifies the widget to register the drawable for.
+.SH DESCRIPTION
+.ZN XtRegisterDrawable
+associates the specified drawable with the specified widget so that
+future calls to
+.ZN XtWindowToWidget
+with the drawable will return the widget. The default event dispatcher
+will dispatch future core events that arrive with the drawable to the
+widget as though the event contained the widget's window, but the event
+itself will not be changed in any way when being passed to even handler
+or action procedures.
+.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
+.ZN XtRegisterDrawable
+are undefined.
+.LP
+.ZN XtUnregisterDrawable
+removes an association created with
+.ZN XtRegisterDrawable .
+If the drawable is the window of a widget in the client's widget tree
+the results of calling
+.ZN XtUnregisterDrawable
+are undefined.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtRegisterExtensionSelector.man b/man/XtRegisterExtensionSelector.man
new file mode 100644 (file)
index 0000000..3a421f7
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtInsertEventTypeHandler.__libmansuffix__
diff --git a/man/XtRegisterGrabAction.man b/man/XtRegisterGrabAction.man
new file mode 100644 (file)
index 0000000..1135416
--- /dev/null
@@ -0,0 +1,152 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtRegister-Grab-Action wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtRegisterGrabAction __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtRegisterGrabAction \- register button and key grabs
+.SH SYNTAX
+.HP
+void XtRegisterGrabAction(XtActionProc \fIaction_proc\fP, Boolean
+\fIowner_events\fP, unsigned int \fIevent_mask\fP, int \fIpointer_mode\fP, int
+\fIkeyboard_mode\fP);
+.SH ARGUMENTS
+.IP \fIaction_proc\fP 1i
+Specifies the action procedure to search for in translation tables.
+.IP \fIaction\fP 1i
+.IP \fIevent\fP 1i
+.IP \fIparams\fP 1i
+.IP \fInum_params\fP 1i
+Specify arguments to
+.ZN XtGrabButton
+or
+.ZN XtGrabKey
+.SH DESCRIPTION
+.ZN XtRegisterGrabAction
+adds the specified \fIaction_proc\fP to a list known to the translation
+manager.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtReleaseGC.man b/man/XtReleaseGC.man
new file mode 100644 (file)
index 0000000..30a347b
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtGetGC.__libmansuffix__
diff --git a/man/XtReleasePropertyAtom.man b/man/XtReleasePropertyAtom.man
new file mode 100644 (file)
index 0000000..ec9e585
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtReservePropertyAtom.__libmansuffix__
diff --git a/man/XtRemoveActionHook.man b/man/XtRemoveActionHook.man
new file mode 100644 (file)
index 0000000..55f3b9d
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAppAddActionHook.__libmansuffix__
diff --git a/man/XtRemoveAllCallbacks.man b/man/XtRemoveAllCallbacks.man
new file mode 100644 (file)
index 0000000..0dbea45
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAddCallback.__libmansuffix__
diff --git a/man/XtRemoveBlockHook.man b/man/XtRemoveBlockHook.man
new file mode 100644 (file)
index 0000000..e9de4eb
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAppAddBlockHook.__libmansuffix__
diff --git a/man/XtRemoveCallback.man b/man/XtRemoveCallback.man
new file mode 100644 (file)
index 0000000..0dbea45
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAddCallback.__libmansuffix__
diff --git a/man/XtRemoveCallbacks.man b/man/XtRemoveCallbacks.man
new file mode 100644 (file)
index 0000000..0dbea45
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAddCallback.__libmansuffix__
diff --git a/man/XtRemoveEventHandler.man b/man/XtRemoveEventHandler.man
new file mode 100644 (file)
index 0000000..ab49e9e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAddEventHandler.__libmansuffix__
diff --git a/man/XtRemoveEventTypeHandler.man b/man/XtRemoveEventTypeHandler.man
new file mode 100644 (file)
index 0000000..3a421f7
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtInsertEventTypeHandler.__libmansuffix__
diff --git a/man/XtRemoveGrab.man b/man/XtRemoveGrab.man
new file mode 100644 (file)
index 0000000..a78d77a
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAddGrab.__libmansuffix__
diff --git a/man/XtRemoveInput.man b/man/XtRemoveInput.man
new file mode 100644 (file)
index 0000000..7e1415d
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAppAddInput.__libmansuffix__
diff --git a/man/XtRemoveRawEventHandler.man b/man/XtRemoveRawEventHandler.man
new file mode 100644 (file)
index 0000000..ab49e9e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAddEventHandler.__libmansuffix__
diff --git a/man/XtRemoveSignal.man b/man/XtRemoveSignal.man
new file mode 100644 (file)
index 0000000..b06beef
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAppAddSignal.__libmansuffix__
diff --git a/man/XtRemoveTimeOut.man b/man/XtRemoveTimeOut.man
new file mode 100644 (file)
index 0000000..ab83b91
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAppAddTimeOut.__libmansuffix__
diff --git a/man/XtRemoveWorkProc.man b/man/XtRemoveWorkProc.man
new file mode 100644 (file)
index 0000000..4dc035b
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAppAddWorkProc.__libmansuffix__
diff --git a/man/XtReservePropertyAtom.man b/man/XtReservePropertyAtom.man
new file mode 100644 (file)
index 0000000..616a54f
--- /dev/null
@@ -0,0 +1,147 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtReserve-Property-Atom XtRelease-Property-Atom wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtReservePropertyAtom __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtReservePropertyAtom, XtReleasePropertyAtom \- maintain a cache of property atoms
+.SH SYNTAX
+.HP
+Widget XtReservePropertyAtom(Widget \fIw\fP);
+.HP
+void XtReleasePropertyAtom(Widget \fIw\fP, Atom \fIatom\fP);
+.SH ARGUMENTS
+.IP \fIw\fP 1i
+Specifies the widget used to reserve the atom.
+.IP \fIatom\fP 1i
+Specifies the atom whose reservation is to be released.
+.SH DESCRIPTION
+.ZN XtReservePropertyAtom
+returns an atom that may be used for properties in conjunction with
+conversion requests from widget \fIw\fP. The atom returned will be
+unique for the display of the widget specified.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtResizeWidget.man b/man/XtResizeWidget.man
new file mode 100644 (file)
index 0000000..172b53b
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtConfigureWidget.__libmansuffix__
diff --git a/man/XtResolvePathname.man b/man/XtResolvePathname.man
new file mode 100644 (file)
index 0000000..9a36460
--- /dev/null
@@ -0,0 +1,281 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtResolve-Pathname wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtResolvePathname __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtResolvePathname \- search for a file using standard substitution
+.SH SYNTAX
+.HP
+String XtResolvePathname(Display *\fIdisplay\fP, String \fItype\fP, String
+\fIfilename\fP, String \fIsuffix\fP, String \fIpath\fP, Substitution
+\fIsubstitutions\fP, Cardinal \fInum_substitutions\fP, XtFilePredicate
+\fIpredicate\fP);
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1.2i
+Specifies the display to use to find the language for language substitutions.
+.IP \fItype\fP
+.br
+.ns
+.IP \fIfilename\fP
+.br
+.ns
+.IP \fIsuffix\fP 1.2i
+Specify values to substitute into the path.
+.IP \fIpath\fP 1.2i
+Specifies the list of file specifications, or NULL.
+.IP \fIsubstitutions\fP 1.2i
+Specifies a list of additional substitutions to make into the path, or NULL.
+.IP \fInum_substitutions\fP 1.2i
+Specifies the number of entries in \fIsubstitutions\fP.
+.IP \fIpredicate\fP 1.2i
+Specifies a procedure called to judge each potential file name, or NULL.
+.SH DESCRIPTION
+The substitutions specified by
+.ZN XtResolvePathname
+are determined from the value of the language string retrieved by
+.ZN XtDisplayInitialize
+for the specified display.
+To set the
+language for all applications specify ``*xnlLanguage: \fIlang\fP'' 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.
+.LP
+.ZN XtResolvePathname
+calls
+.ZN XtFindFile
+with the following substitutions
+in addition to any passed by the caller and returns the value returned by
+.ZN XtFindFile :
+.IP %N 5
+The value of the \fIfilename\fP parameter, or the application's
+class name if \fIfilename\fP is NULL.
+.IP %T 5
+The value of the \fItype\fP parameter.
+.IP %S 5
+The value of the \fIsuffix\fP parameter.
+.IP %L 5
+The language string associated with the specified display.
+.IP %l 5
+The language part of the display's language string.
+.IP %t 5
+The territory part of the display's language string.
+.IP %c 5
+The codeset part of the display's language string.
+.IP %C 5
+The customization string retrieved from the resource
+database associated with \fIdisplay\fP.
+.IP %D 5
+The value of the implementation-specific default path.
+.LP
+If a path is passed to
+.ZN XtResolvePathname ,
+it will be passed along to
+.ZN XtFindFile .
+If the \fIpath\fP argument is NULL, the value of the
+.ZN \s-1XFILESEARCHPATH\s+1
+.IN "XFILESEARCHPATH" "" "@DEF@"
+environment variable will be passed to
+.ZN XtFindFile .
+If
+.ZN \s-1XFILESEARCHPATH\s+1
+is not defined, an implementation-specific default path will be used
+which contains at least 6 entries.  These entries
+must contain the following substitutions:
+
+.nf
+.ta 3n 23n 27n
+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 is implementation
+dependent.
+If the path begins
+with a colon, it will be preceded by %N%S.  If the path includes two
+adjacent colons, \fB%N%S\fP will be inserted between them.
+.LP
+The \fItype\fP 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''.
+.LP
+The \fIsuffix\fP parameter is intended to be appended to the file name.
+Possible values might include ``.txt'', ``.dat'', and ``.bm''.
+.LP
+A suggested value for the default path on POSIX-based systems is
+.IP
+__projectroot__/lib/X11/%L/%T/%N%C%S:__projectroot__/lib/X11/%l/%T/%N%C%S:\\
+.br
+__projectroot__/lib/X11/%T/%N%C%S:__projectroot__/lib/X11/%L/%T/%N%S:\\
+.br
+__projectroot__/lib/X11/%l/%T/%N%S:__projectroot__/lib/X11/%T/%N%S
+.LP
+Using this example, if the user has specified a language, it will be
+used as a subdirectory of __projectroot__/lib/X11 that will be searched
+for other files.  If the desired file is not found there, the lookup
+will be tried again using just the language part of the specification.
+If the file is not there, it will be looked for in
+__projectroot__/lib/X11.  The \fItype\fP parameter is used as a
+subdirectory of the language directory or of __projectroot__/lib/X11,
+and \fIsuffix\fP is appended to the file name.
+.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
+.ZN \s-1XFILESEARCHPATH\s+1
+to
+.IP
+%D:ourdir/%T/%N%C:ourdir/%T/%N
+.LP
+The customization string is obtained by querying the resource database
+currently associated with the display (the database returned by
+.ZN XrmGetDatabase )
+for the resource \fIapplication_name\fP.customization, class
+\fIapplication_class\fP.Customization where \fIapplication_name\fP
+and \fIapplication_class\fP are the values returned by
+.ZN XtGetApplicationNameAndClass .
+If no value is specified in the database, the empty string is used.
+.LP
+It is the responsibility of the caller to free the returned string using
+.ZN XtFree
+when it is no longer needed.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtScreen.man b/man/XtScreen.man
new file mode 100644 (file)
index 0000000..b9e795c
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtDisplay.__libmansuffix__
diff --git a/man/XtScreenDatabase.man b/man/XtScreenDatabase.man
new file mode 100644 (file)
index 0000000..0a0994c
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtDisplayInitialize.__libmansuffix__
diff --git a/man/XtScreenOfObject.man b/man/XtScreenOfObject.man
new file mode 100644 (file)
index 0000000..b9e795c
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtDisplay.__libmansuffix__
diff --git a/man/XtSendSelectionRequest.man b/man/XtSendSelectionRequest.man
new file mode 100644 (file)
index 0000000..e6df724
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtCreateSelectionRequest.__libmansuffix__
diff --git a/man/XtSessionGetToken.man b/man/XtSessionGetToken.man
new file mode 100644 (file)
index 0000000..210dc66
--- /dev/null
@@ -0,0 +1,154 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtSession-Get-Token XtSession-Return-Token wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtSessionGetToken __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtSessionGetToken, XtSessionReturnToken \- token management for checkpointing
+.SH SYNTAX
+.HP
+XtCheckpointToken XtSessionGetToken(Widget \fIw\fP, int \fItype\fP);
+.HP
+void XtSessionReturnToken(XtCheckpointToken \fItoken\fP);
+.SH ARGUMENTS
+.IP \fIw\fP 1i
+Specifies the session widget.
+.IP \fItype\fP 1i
+Specifies the value in the type field of the token.
+.IP \fItoken\fP 1i
+Specifies the token to be returned.
+.SH DESCRIPTION
+The
+.ZN XtSessionGetToken
+function will return NULL if the checkpoint operation instigated by
+the session manager is not currently under way.
+.LP
+To indicate the completion of a deferred save operation and to return
+the checkpoint token use
+.ZN XtSessionReturnToken .
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtSessionReturnToken.man b/man/XtSessionReturnToken.man
new file mode 100644 (file)
index 0000000..fa36937
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtSessionGetToken.__libmansuffix__
diff --git a/man/XtSetArg.man b/man/XtSetArg.man
new file mode 100644 (file)
index 0000000..1d2a8ed
--- /dev/null
@@ -0,0 +1,206 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtSet-Arg XtMerge-Arg-Lists wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtSetArg __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtSetArg, XtMergeArgLists \- set and merge ArgLists
+.SH SYNTAX
+.HP
+int XtSetArg(Arg \fIarg\fP, String \fIname\fP, XtArgVal \fIvalue\fP);
+.HP
+ArgList XtMergeArgLists(ArgList \fIargs1\fP, Cardinal \fInum_args1\fP, ArgList
+\fIargs2\fP, Cardinal \fInum_args2\fP);
+.SH ARGUMENTS
+.IP \fIarg\fP 1i
+Specifies the name-value pair to set.
+.IP \fIargs1\fP 1i
+Specifies the first
+.ZN ArgList .
+.IP \fIargs2\fP 1i
+Specifies the second
+.ZN ArgList .
+.IP \fInum_args1\fP 1i
+Specifies the number of arguments in the first argument list.
+.IP \fInum_args2\fP 1i
+Specifies the number of arguments in the second argument list.
+.IP \fIname\fP 1i
+Specifies the name of the resource.
+.IP \fIvalue\fP 1i
+Specifies the value of the resource if it will fit in an
+.ZN XtArgVal
+or the address.
+.SH DESCRIPTION
+The
+.ZN XtSetArg
+function is usually used in a highly stylized manner to
+minimize the probability of making a mistake; for example:
+.LP
+.Ds
+.TA .5i 3i
+.ta .5i 3i
+Arg args[20];
+int n;
+
+n = 0;
+XtSetArg(args[n], XtNheight, 100);     n++;
+XtSetArg(args[n], XtNwidth, 200);      n++;
+XtSetValues(widget, args, n);
+.De
+.LP
+Alternatively, an application can statically declare the argument list
+and use
+.ZN XtNumber :
+.LP
+.Ds
+.TA .5i 3i
+.ta .5i 3i
+static Args args[] = {
+       {XtNheight, (XtArgVal) 100},
+       {XtNwidth, (XtArgVal) 200},
+};
+XtSetValues(Widget, args, XtNumber(args));
+.De
+.LP
+Note that you should not use auto-increment or auto-decrement
+within the first argument to
+.ZN XtSetArg .
+.ZN XtSetArg
+can be implemented as a macro that dereferences the first argument twice.
+.LP
+The
+.ZN XtMergeArgLists
+function allocates enough storage to hold the combined
+.ZN ArgList
+structures and copies them into it.
+Note that it does not check for duplicate entries.
+When it is no longer needed,
+free the returned storage by using
+.ZN XtFree .
+.SH "SEE ALSO"
+XtOffset(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtSetErrorHandler.man b/man/XtSetErrorHandler.man
new file mode 100644 (file)
index 0000000..e65c3f1
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtError.__libmansuffix__
diff --git a/man/XtSetErrorMsgHandler.man b/man/XtSetErrorMsgHandler.man
new file mode 100644 (file)
index 0000000..bb7e387
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtErrorMsg.__libmansuffix__
diff --git a/man/XtSetEventDispatcher.man b/man/XtSetEventDispatcher.man
new file mode 100644 (file)
index 0000000..3a421f7
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtInsertEventTypeHandler.__libmansuffix__
diff --git a/man/XtSetKeyTranslator.man b/man/XtSetKeyTranslator.man
new file mode 100644 (file)
index 0000000..d29cba2
--- /dev/null
@@ -0,0 +1,210 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtSet-Key-Translator XtTranslate-Keycode XtRegister-Case-Converter XtConvert-Case wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtSetKeyTranslator __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtSetKeyTranslator, XtTranslateKeycode, XtRegisterCaseConverter, XtConvertCase \- convert KeySym to KeyCodes
+.SH SYNTAX
+.HP
+void XtSetKeyTranslator(Display *\fIdisplay\fP, XtKeyProc \fIproc\fP);
+.HP
+void XtTranslateKeycode(Display *\fIdisplay\fP, KeyCode \fIkeycode\fP,
+Modifiers \fImodifiers\fP, Modifiers *\fImodifiers_return\fP, KeySym
+*\fIkeysym_return\fP);
+.HP
+void XtRegisterCaseConverter(Display *\fIdisplay\fP, XtCaseProc \fIproc\fP,
+KeySym \fIstart\fP, KeySym \fIstop\fP);
+.HP
+void XtConvertCase(Display *\fIdisplay\fP, KeySym \fIkeysym\fP, KeySym
+*\fIlower_return\fP, KeySym *\fIupper_return\fP);
+.SH ARGUMENTS
+.ds Di
+.IP \fIdisplay\fP 1i
+Specifies the display\*(Di.
+.IP \fIkeycode\fP 1i
+Specifies the KeyCode to translate.
+.IP \fIkeysym\fP 1i
+Specifies the KeySym to convert.
+.IP \fIkeysym_return\fP 1i
+Returns the resulting KeySym.
+.IP \fIlower_return\fP 1i
+Returns the lowercase equivalent of the KeySym.
+.IP \fIupper_return\fP 1i
+Returns the uppercase equivalent of the KeySym.
+.IP \fImodifiers\fP 1i
+Specifies the modifiers to the KeyCode.
+.IP \fImodifiers_return\fP 1i
+Returns a mask that indicates the modifiers actually used
+to generate the KeySym.
+.ds Pr \ to perform key translations or conversions
+.IP \fIproc\fP 1i
+Specifies the procedure that is\*(Pr.
+.IP \fIstart\fP 1i
+Specifies the first KeySym for which this converter is valid.
+.IP \fIstop\fP 1i
+Specifies the last KeySym for which this converter is valid.
+.SH DESCRIPTION
+The
+.ZN XtSetKeyTranslator
+function sets the specified procedure as the current key translator.
+The default translator is
+.ZN XtTranslateKey ,
+an
+.ZN XtKeyProc
+that uses Shift and Lock modifiers with the interpretations defined
+by the core protocol.
+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.
+.LP
+The
+.ZN XtTranslateKeycode
+function passes the specified arguments
+directly to the currently registered KeyCode to KeySym translator.
+.LP
+The
+.ZN XtRegisterCaseConverter
+registers the specified case converter.
+The start and stop 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  refreshes the keyboard state if necessary.
+The default converter understands case conversion for all
+KeySyms defined in the core protocol.
+.LP
+The
+.ZN XtConvertCase
+function calls the appropriate converter and returns the results.
+A user-supplied
+.ZN XtKeyProc
+may need to use this function.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtSetKeyboardFocus.man b/man/XtSetKeyboardFocus.man
new file mode 100644 (file)
index 0000000..ab64998
--- /dev/null
@@ -0,0 +1,188 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtSet-Keyboard-Focus wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtSetKeyboardFocus __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtSetKeyboardFocus \- focus events on a child widget
+.SH SYNTAX
+.HP
+XtSetKeyboardFocus(Widget \fIsubtree\fP, Widget \fIdescendant\fP);
+.SH ARGUMENTS
+.IP \fIsubtree\fP 1i
+Specifies either the widget in the subtree structure which is to receive the
+keyboard event, or
+.ZN None .
+Note that it is not an error to specify
+.ZN None
+when no input focus was previously set.
+.ds Wi for which the keyboard focus is to be set
+.IP \fIdescendant\fP 1i
+Specifies the widget \*(Wi.
+.SH DESCRIPTION
+If a future
+.ZN KeyPress
+or
+.ZN KeyRelease
+event occurs within the specified subtree,
+.ZN XtSetKeyboardFocus
+causes
+.ZN XtDispatchEvent
+to remap and send the event to the specified descendant widget.
+.LP
+When there is no modal cascade,
+keyboard events can occur within a widget W in one of three ways:
+.IP \(bu 5
+W has the X input focus.
+.IP \(bu 5
+W has the keyboard focus of one of its ancestors,
+and the event occurs within the ancestor or one of the ancestor's descendants.
+.IP \(bu 5
+No ancestor of W has a descendant within the keyboard focus,
+and the pointer is within W.
+.LP
+When there is a modal cascade,
+a widget W receives keyboard events if an ancestor of W is in the active
+subset of the modal cascade and one or more of the previous conditions is
+.ZN True .
+.LP
+When subtree 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 subtree, a
+.ZN FocusIn
+event is generated for the descendant if
+.ZN FocusNotify
+events have been selected by the descendant.
+Similarly, when W loses the X input focus
+or the keyboard focus for one of its ancestors, a
+.ZN FocusOut
+event is generated for descendant if
+.ZN FocusNotify
+events have been selected by the descendant.
+.SH "SEE ALSO"
+XtCallAcceptFocus(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtSetLanguageProc.man b/man/XtSetLanguageProc.man
new file mode 100644 (file)
index 0000000..030aaa7
--- /dev/null
@@ -0,0 +1,195 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtSet-Language-Proc wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtSetLanguageProc __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtSetLanguageProc \- set the language procedure
+.SH SYNTAX
+.HP
+Widget XtSetLanguageProc(XtAppContext \fIapp_context\fP, XtLanguageProc
+\fIproc\fP, XtPointer \fIclient_data\fP);
+.SH ARGUMENTS
+.IP \fIapp_context\fP 1i
+Specifies the application context in which the language procedure
+is to be used, or NULL.
+.LP
+.IP \fIproc\fP 1i
+Specifies the language procedure, or NULL.
+.LP
+.IP \fIclient_data\fP 1i
+Specifies additional client data to be passed to the language procedure
+when it is called.
+.SH DESCRIPTION
+.ZN XtSetLanguageProc
+sets the language procedure that will be called from
+.ZN XtDisplayInitialize
+for all subsequent Displays initialized in the specified application
+context. If \fIapp_context\fP is NULL, the specified language procedure
+is registered in all application contexts created by the calling process,
+including any future application contexts that may be created. If
+\fIproc\fP is NULL a default language procedure is registered.
+.ZN XtSetLanguageProc
+returns the previously registered language procedure. If a language
+procedure has not yet been registered, the return value is unspecified
+but if this return value is used in a subsequent call to
+.ZN XtSetLanguageProc ,
+it will cause the default language procedure to be registered.
+.LP
+The default language procedure does the following:
+.IP \(bu 5
+Sets the locale according to the environment. On ANSI C-based systems
+this is done by calling
+.ZN setlocale (
+.ZN LC_ALL ,
+language ). If an error is encountered a warning message is issued with
+.ZN XtWarning .
+.IP \(bu 5
+Calls
+.ZN XSupportsLocale
+to verify that the current locale is supported. If the locale is not
+supported, a warning message is issued with
+.ZN XtWarning
+and the locale is set to ``C''.
+.IP \(bu 5
+Calls
+.ZN XSetLocaleModifiers
+specifying the empty string.
+.IP \(bu 5
+Returns the value of the current locale. On ANSI C-based systems this
+is the return value from a final call to
+.ZN setlocale (
+.ZN LC_ALL ,
+NULL ).
+.LP
+A client wishing to use this mechanism to establish locale can do so
+by calling
+.ZN XtSetLanguageProc
+prior to
+.ZN XtDisplayInitialize.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtSetMappedWhenManaged.man b/man/XtSetMappedWhenManaged.man
new file mode 100644 (file)
index 0000000..73caf7d
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtMapWidget.__libmansuffix__
diff --git a/man/XtSetMultiClickTime.man b/man/XtSetMultiClickTime.man
new file mode 100644 (file)
index 0000000..eec789d
--- /dev/null
@@ -0,0 +1,151 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtSet-Multi-Click-Time Xt-Get-Multi-Click-Time wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtSetMultiClickTime __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtSetMultiClickTime, XtGetMultiClickTime \- set and get multi-click times
+.SH SYNTAX
+.HP
+void XtSetMultiClickTime(Display* \fIdisplay\fP, int \fItime\fP);
+.HP
+int XtGetMultiClickTime(Display* \fIdisplay\fP);
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the display connection.
+.IP \fItime\fP 1i
+Specifies the multi-click time in milliseconds.
+.SH DESCRIPTION
+.ZN XtSetMultiClickTime
+sets the time interval used by the translation manager to determine
+when multiple events are interpreted as a repeated event.
+.LP
+.ZN XtGetMultiClickTime
+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.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtSetSelectionParameters.man b/man/XtSetSelectionParameters.man
new file mode 100644 (file)
index 0000000..dd198b5
--- /dev/null
@@ -0,0 +1,187 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtSet-Selection-Parameters XtGet-Selection-Parameters wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtSetSelectionParameters __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtSetSelectionParameters \- specify target parameters for a selection request with a single target
+.SH SYNTAX
+.HP
+void XtSetSelectionParameters(Widget \fIrequestor\fP, Atom \fIselection\fP,
+Atom \fItype\fP, XtPointer \fIvalue\fP, unsigned long \fIlength\fP, int
+\fIformat\fP);
+.SH ARGUMENTS
+.IP \fIrequestor\fP 1i
+Specifies the widget making the request. Must be of class Core or any
+subclass thereof.
+.IP \fIselection\fP 1i
+Specifies the atom that names the selection.
+.IP \fItype\fP 1i
+Specifies the type of the property in which the parameters will be passed.
+.IP \fIvalue\fP 1i
+Specifies a pointer to the parameters.
+.IP \fIlength\fP 1i
+Specifies the number of elements containing data in \fIvalue\fP, each
+element of a sized indicated by \fIformat\fP.
+.IP \fIformat\fP 1i
+Specifies the size in bits of the data in the elements of \fIvalue\fP.
+.SH DESCRIPTION
+The specified parameters will be 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
+.ZN XtGetSelectionValue
+or to
+.ZN XtGetSelectionValueIncremental
+specifying the same requestor widget and selection atom will generate a
+.ZN ConvertSelection
+request referring referring to the property containing the parameters. If
+.ZN XtSetSelectionParameters
+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.
+.LP
+The possible values of \fIformat\fP may be 8, 16, or 32. If the \fIformat\fP
+is 8, the elements of \fIvalue\fP are assumed to be sizeof(char); if 16,
+sizeof(short); if 32, sizeof(long).
+.LP
+To generate a MULTIPLE target request with parameters for any of the
+multiple targets of the selection request, precede individual calls to
+.ZN XtGetSelectionValue
+and
+.ZN XtGetSelectionValueIncremental
+with corresponding individual calls to
+.ZN XtSetSelectionParameters ,
+and enclose these all within
+.ZN XtCreateSelectionRequest
+and
+.ZN XtSendSelectionRequest .
+.ZN XtGetSelectionValues
+and
+.ZN XtGetSelectionValuesIncremental
+cannot be used  to make selection requests with parameterized targets.
+.SH "SEE ALSO"
+XtGetSelectionParameters(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtSetSelectionTimeout.man b/man/XtSetSelectionTimeout.man
new file mode 100644 (file)
index 0000000..41e5820
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtGetSelectionTimeout.__libmansuffix__
diff --git a/man/XtSetSensitive.man b/man/XtSetSensitive.man
new file mode 100644 (file)
index 0000000..2a9f00c
--- /dev/null
@@ -0,0 +1,187 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtSet-Sensitive XtIs-Sensitive wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtSetSensitive __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtSetSensitive, XtIsSensitive \- set and check a widget's sensitivity state
+.SH SYNTAX
+.HP
+void XtSetSensitive(Widget \fIw\fP, Boolean \fIsensitive\fP);
+.HP
+Boolean XtIsSensitive(Widget \fIw\fP);
+.SH ARGUMENTS
+.IP \fIsensitive\fP 1i
+Specifies a Boolean value that indicates whether the widget should receive
+keyboard and pointer events.
+.IP \fIw\fP 1i
+Specifies the widget.
+.SH DESCRIPTION
+The
+.ZN XtSetSensitive
+function first calls
+.ZN XtSetValues
+on the current widget with an argument list specifying that the
+sensitive field should change to the new value.
+It then recursively propagates the new value
+down the managed children tree by calling
+.ZN XtSetValues
+on each child to set the ancestor_sensitive to the new value if the new
+values for sensitive and the child's ancestor_sensitive are not the same.
+.LP
+.ZN XtSetSensitive
+calls
+.ZN XtSetValues
+to change sensitive and ancestor_sensitive.
+Therefore, when one of these changes,
+the widget's set_values procedure should
+take whatever display actions are needed
+(for example, greying out or stippling the widget).
+.LP
+.ZN XtSetSensitive
+maintains the invariant that if parent has either sensitive
+or ancestor_sensitive
+.ZN False ,
+then all children have ancestor_sensitive
+.ZN False .
+.LP
+The
+.ZN XtIsSensitive
+function returns
+.ZN True
+or
+.ZN False
+to indicate whether or not user input events are being dispatched.
+If both core.sensitive and core.ancestor_sensitive are
+.ZN True ,
+.ZN XtIsSensitive
+returns
+.ZN True ;
+otherwise, it returns
+.ZN False .
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtSetSubvalues.man b/man/XtSetSubvalues.man
new file mode 100644 (file)
index 0000000..a7e954e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtSetValues.__libmansuffix__
diff --git a/man/XtSetTypeConverter.man b/man/XtSetTypeConverter.man
new file mode 100644 (file)
index 0000000..df22e68
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAppSetTypeConverter.__libmansuffix__
diff --git a/man/XtSetValues.man b/man/XtSetValues.man
new file mode 100644 (file)
index 0000000..e1ac659
--- /dev/null
@@ -0,0 +1,278 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtSet-Values XtVa-Set-Values XtSet-Subvalues XtVa-Set-Subvalues XtGet-Values XtVa-Get-Values XtGet-Subvalues XtVa-Get-Subvalues constraint-Widget-Class wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtSetValues __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtSetValues, XtVaSetValues, XtSetSubvalues, XtVaSetSubvalues, XtGetValues, XtVaGetValues, XtGetSubvalues, XtVaGetSubvalues \- obtain and set widget resources
+.SH SYNTAX
+.HP
+void XtSetValues(Widget \fIw\fP, ArgList \fIargs\fP, Cardinal \fInum_args\fP);
+.HP
+void XtVaSetValues(Widget \fIw\fP, ...\^);
+.HP
+void XtSetSubvalues(XtPointer \fIbase\fP, XtResourceList \fIresources\fP,
+Cardinal \fInum_resources\fP, ArgList \fIargs\fP, Cardinal \fInum_args\fP);
+.HP
+void XtVaSetSubvalues(XtPointer \fIbase\fP, XtResourceList \fIresources\fP,
+Cardinal \fInum_resources\fP, ...\^);
+.HP
+void XtGetValues(Widget \fIw\fP, ArgList \fIargs\fP, Cardinal \fInum_args\fP);
+.HP
+void XtVaGetValues(Widget \fIw\fP, ...\^);
+.HP
+void XtGetSubvalues(XtPointer \fIbase\fP, XtResourceList \fIresources\fP,
+Cardinal \fInum_resources\fP, ArgList \fIargs\fP, Cardinal \fInum_args\fP);
+.HP
+void XtVaGetSubvalues(XtPointer \fIbase\fP, XtResourceList \fIresources\fP,
+Cardinal \fInum_resources\fP, ...\^);
+.SH ARGUMENTS
+.ds Al of name/address pairs that contain the resource name \
+and either the address into which the resource value is to be stored \
+or their new values
+.IP \fIargs\fP 1i
+Specifies the argument list \*(Al.
+.ds Ba retrieved or written
+.IP \fIbase\fP 1i
+Specifies the base address of the subpart data structure where the resources
+should be \*(Ba.
+.IP \fInum_args\fP 1i
+Specifies the number of arguments in the argument list.
+.IP \fIresources\fP 1i
+Specifies the nonwidget resource list or values.
+.IP \fInum_resources\fP 1i
+Specifies the number of resources in the resource list.
+.IP \fIw\fP 1i
+Specifies the widget.
+.IP \fI...\fP 1i
+Specifies the variable argument list \*(Al.
+.SH DESCRIPTION
+The
+.ZN XtSetValues
+function starts with the resources specified for the
+.ZN Core
+widget fields and proceeds down the subclass chain to the widget.
+At each stage,
+it writes the new value (if specified by one of the arguments) or the existing
+value (if no new value is specified) to a new widget data record.
+.ZN XtSetValues
+then calls the set_values procedures for the widget in superclass-to-subclass
+order.
+.IN "hook"
+If the widget has any non-NULL set_values_hook fields,
+these are called immediately after the
+corresponding set_values procedure.
+This procedure permits subclasses to set nonwidget data for
+.ZN XtSetValues .
+.LP
+If the widget's parent is a subclass of
+.ZN constraintWidgetClass ,
+.ZN XtSetValues
+also updates the widget's constraints.
+It starts with the constraint resources specified for
+.ZN constraintWidgetClass
+and proceeds down the subclass chain to the parent's class.
+At each stage,
+it writes the new value or the existing value to a new constraint record.
+It then calls the constraint set_values procedures from
+.ZN constraintWidgetClass
+down to the parent's class.
+The constraint set_values procedures are called with widget arguments,
+as for all set_values procedures, not just the constraint record arguments,
+so that they can make adjustments to the desired values based
+on full information about the widget.
+.LP
+.ZN XtSetValues
+determines if a geometry request is needed by comparing the current widget to
+the new widget.
+If any geometry changes are required,
+it makes the request, and the geometry manager returns
+.ZN XtGeometryYes ,
+.ZN XtGeometryAlmost ,
+or
+.ZN XtGeometryNo .
+If
+.ZN XtGeometryYes ,
+.ZN XtSetValues
+calls the widget's resize procedure.
+If
+.ZN XtGeometryNo ,
+.ZN XtSetValues
+resets the geometry fields to their original values.
+If
+.ZN XtGeometryAlmost ,
+.ZN XtSetValues
+calls the set_values_almost procedure,
+which determines what should be done and writes new values for the
+geometry fields into the new widget.
+.ZN XtSetValues
+then repeats this process,
+deciding once more whether the geometry manager should be called.
+.LP
+Finally, if any of the set_values procedures returned
+.ZN True ,
+.ZN XtSetValues
+causes the widget's expose procedure to be invoked by calling the Xlib
+.ZN XClearArea
+function on the widget's window.
+.LP
+The
+.ZN XtSetSubvalues
+function stores resources into the structure identified by base.
+.LP
+The
+.ZN XtGetValues
+function starts with the resources specified for the core widget fields
+and proceeds down the subclass chain to the widget.
+The value field of a passed argument list should 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 widget.
+.LP
+If the widget's parent is a subclass of
+.ZN constraintWidgetClass ,
+.ZN XtGetValues
+then fetches the values for any constraint resources requested.
+It starts with the constraint resources specified for
+.ZN constraintWidgetClass
+and proceeds down to 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 "hook"
+Finally, if the get_values_hook procedures are non-NULL,
+they are called in superclass-to-subclass order after
+all the resource values have been fetched by
+.ZN XtGetValues .
+This permits a subclass to provide nonwidget resource data to
+.ZN XtGetValues .
+.LP
+The
+.ZN XtGetSubvalues
+function obtains resource values from the structure identified by base.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtSetWMColormapWindows.man b/man/XtSetWMColormapWindows.man
new file mode 100644 (file)
index 0000000..c4e07c5
--- /dev/null
@@ -0,0 +1,161 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtSet-WMColormap-Windows wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtSetWMColormapWindows __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtSetWMColormapWindows \- Set the value of the WM_COLORMAP_WINDOWS property
+.SH SYNTAX
+.HP
+void XtSetWMColormapWindows(Widget \fIwidget\fP, Widget* \fIlist\fP, Cardinal
+\fIcount\fP);
+.SH ARGUMENTS
+.IP \fIwidget\fP 1i
+Specifies the widget on whose window the WM_COLORMAP_WINDOWS property
+will be stored. Must be of class Core or any subclass thereof.
+.IP \fIlist\fP 1i
+Specifies a list of widgets whose windows are are potentially to be
+listed in the WM_COLORMAP_WINDOWS property.
+.IP \fIcount\fP 1i
+Specifies the number of widgets in \fIlist\fP.
+.SH DESCRIPTION
+.ZN XtSetWMColormapWindows
+returns immediately if \fIwidget\fP is not realized or if \fIcount\fP
+is zero. Otherwise,
+.ZN XtSetWMColormapWindows
+constructs an ordered list of windows by examining each widget in
+\fIlist\fP 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 its colormap resource is different from the colormap
+resources of all widgets whose windows are already on the window
+list.
+.LP
+Finally,
+.ZN XtSetWMColormapWindows
+stores the resulting window list in the WM_COLORMAP_WINDOWS property
+on the specified widget's window.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtSetWarningHandler.man b/man/XtSetWarningHandler.man
new file mode 100644 (file)
index 0000000..e65c3f1
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtError.__libmansuffix__
diff --git a/man/XtSetWarningMsgHandler.man b/man/XtSetWarningMsgHandler.man
new file mode 100644 (file)
index 0000000..bb7e387
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtErrorMsg.__libmansuffix__
diff --git a/man/XtStringConversionWarning.man b/man/XtStringConversionWarning.man
new file mode 100644 (file)
index 0000000..455f5a7
--- /dev/null
@@ -0,0 +1,155 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtString-Conversion-Warning wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtStringConversionWarning __libmansuffix__ __xorgversion__ "XT COMPATIBILITY FUNCTIONS"
+.SH NAME
+XtStringConversionWarning \- issue a conversion warning message
+.SH SYNTAX
+.HP
+void XtStringConversionWarning(String \fIsrc\fP, String \fIdst_type\fP);
+.SH ARGUMENTS
+.IP \fIsrc\fP 1i
+Specifies the string that could not be converted.
+.IP \fIdst_type\fP 1i
+Specifies the name of the type to which the string could not be converted.
+.SH DESCRIPTION
+The
+.ZN XtStringConversionWarning
+function issues a warning message with name ``conversionError'',
+type ``string'', class ``XtToolkitError, and the default message string
+``Cannot convert "\fIsrc\fP" to type \fIdst_type\fP''.
+.LP
+.ZN XtStringConversionWarning
+has been replaced by
+.ZN XtDisplayStringConversionWarning .
+.SH "SEE ALSO"
+XtAppAddConverter(__libmansuffix__),
+XtAppErrorMsg(3t),
+XtConvert(__libmansuffix__),
+XtDisplayStringConversionWarning(__libmansuffix__)
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtSuperclass.man b/man/XtSuperclass.man
new file mode 100644 (file)
index 0000000..99800c9
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtClass.__libmansuffix__
diff --git a/man/XtToolkitInitialize.man b/man/XtToolkitInitialize.man
new file mode 100644 (file)
index 0000000..ae5d5b5
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtCreateApplicationContext.__libmansuffix__
diff --git a/man/XtToolkitThreadInitialize.man b/man/XtToolkitThreadInitialize.man
new file mode 100644 (file)
index 0000000..c2fd8db
--- /dev/null
@@ -0,0 +1,147 @@
+.\" Copyright (c) 1993, 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 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
+.\" dealing in this Software without prior written authorization from the
+.\" X Consortium.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtToolkit-Thread-Initialize wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtToolkitThreadInitialize __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtToolkitThreadInitialize \- initialize the toolkit for multiple threads
+.SH SYNTAX
+.HP
+Boolean XtToolkitThreadInitialize(void);
+.SH DESCRIPTION
+If
+.ZN XtToolkitThreadInitialize
+was previously called, it returns. The application programmer must ensure
+that two or more threads do not simultaneously attempt to call
+.ZN XtToolkitThreadInitialize ;
+the effect of this is undefined.
+.ZN XtToolkitThreadInitialize
+returns
+.ZN True
+if the host operating system has threads and the Intrinsics are thread
+safe.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtTranslateCoords.man b/man/XtTranslateCoords.man
new file mode 100644 (file)
index 0000000..fb7d6c7
--- /dev/null
@@ -0,0 +1,158 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtTranslate-Coords wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtTranslateCoords __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtTranslateCoords \- translate widget coordinates
+.SH SYNTAX
+.HP
+void XtTranslateCoords(Widget \fIw\fP, Position \fIx\fP, \fIy\fP, Position
+*\fIrootx_return\fP, *\fIrooty_return\fP);
+.SH ARGUMENTS
+.IP \fIrootx_return\fP 1i
+.br
+.ns
+.IP \fIrooty_return\fP 1i
+Returns the root-relative x and y coordinates.
+.ds Nu widget-relative
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the \*(Nu x and y coordinates.
+.IP \fIw\fP 1i
+Specifies the widget.
+.SH DESCRIPTION
+While
+.ZN XtTranslateCoords
+is similar to the Xlib
+.ZN XTranslateCoordinates
+function, it does not generate a server request because all the required
+information already is in the widget's data structures.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtTranslateKeycode.man b/man/XtTranslateKeycode.man
new file mode 100644 (file)
index 0000000..db83837
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtSetKeyTranslator.__libmansuffix__
diff --git a/man/XtUngrabButton.man b/man/XtUngrabButton.man
new file mode 100644 (file)
index 0000000..3d7d5c3
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtGrabKey.__libmansuffix__
diff --git a/man/XtUngrabKey.man b/man/XtUngrabKey.man
new file mode 100644 (file)
index 0000000..3d7d5c3
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtGrabKey.__libmansuffix__
diff --git a/man/XtUngrabKeyboard.man b/man/XtUngrabKeyboard.man
new file mode 100644 (file)
index 0000000..3d7d5c3
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtGrabKey.__libmansuffix__
diff --git a/man/XtUngrabPointer.man b/man/XtUngrabPointer.man
new file mode 100644 (file)
index 0000000..3d7d5c3
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtGrabKey.__libmansuffix__
diff --git a/man/XtUninstallTranslations.man b/man/XtUninstallTranslations.man
new file mode 100644 (file)
index 0000000..4f4cdde
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtParseTranslationTable.__libmansuffix__
diff --git a/man/XtUnmanageChild.man b/man/XtUnmanageChild.man
new file mode 100644 (file)
index 0000000..98b4bb6
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtManageChildren.__libmansuffix__
diff --git a/man/XtUnmanageChildren.man b/man/XtUnmanageChildren.man
new file mode 100644 (file)
index 0000000..98b4bb6
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtManageChildren.__libmansuffix__
diff --git a/man/XtUnmapWidget.man b/man/XtUnmapWidget.man
new file mode 100644 (file)
index 0000000..73caf7d
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtMapWidget.__libmansuffix__
diff --git a/man/XtUnrealizeWidget.man b/man/XtUnrealizeWidget.man
new file mode 100644 (file)
index 0000000..ad4af05
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtRealizeWidget.__libmansuffix__
diff --git a/man/XtUnregisterDrawable.man b/man/XtUnregisterDrawable.man
new file mode 100644 (file)
index 0000000..612b3ac
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtRegisterDrawable.__libmansuffix__
diff --git a/man/XtVaAppCreateShell.man b/man/XtVaAppCreateShell.man
new file mode 100644 (file)
index 0000000..3c4fa8b
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAppCreateShell.__libmansuffix__
diff --git a/man/XtVaAppInitialize.man b/man/XtVaAppInitialize.man
new file mode 100644 (file)
index 0000000..803169a
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtAppInitialize.__libmansuffix__
diff --git a/man/XtVaCreateArgsList.man b/man/XtVaCreateArgsList.man
new file mode 100644 (file)
index 0000000..81a8c60
--- /dev/null
@@ -0,0 +1,157 @@
+.\" Copyright 1993 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.
+.\"
+.ds tk X Toolkit
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xI Intrinsics
+.ds xW X Toolkit Athena Widgets \- C Language Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.ds Rn 3
+.ds Vn 2.2
+.hw XtVa-Create-Args-List wid-get
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN         \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\"    choose appropriate monospace font
+.\"    the imagen conditional, 480,
+.\"    may be changed to L if LB is too
+.\"    heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+.              \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XtVaCreateArgsList __libmansuffix__ __xorgversion__ "XT FUNCTIONS"
+.SH NAME
+XtVaCreateArgsList \- dynamically allocate a varargs list
+.SH SYNTAX
+.HP
+XtVarArgsList XtVaCreateArgsList(XtPointer \fIunused\fP, ...\^);
+.SH ARGUMENTS
+.IP \fIunused\fP 1i
+Must be specified as NULL.
+.IP \fI...\fP 1i
+Specifies a variable parameter list of resource name and value pairs.
+.SH DESCRIPTION
+The
+.ZN XtVaCreateArgsList
+function allocates memory and copies its arguments into a single list
+pointer, which may be used with
+.ZN XtVaNestedList .
+The end of both lists is identified by a \fIname\fP entry containing
+NULL. Any entries of type
+.ZN XtVaTypedArg
+are copied as specified without applying conversions. Data passed by
+reference (including Strings) are not copied, only the pointers
+themselves; the caller must ensure that the data remain valid for
+the lifetime of the created varargs list. The list should be freed
+using
+.ZN XtFree
+when no longer needed.
+.SH "SEE ALSO"
+.br
+\fI\*(xT\fP
+.br
+\fI\*(xL\fP
diff --git a/man/XtVaCreateManagedWidget.man b/man/XtVaCreateManagedWidget.man
new file mode 100644 (file)
index 0000000..e3e83b4
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtCreateWidget.__libmansuffix__
diff --git a/man/XtVaCreatePopupShell.man b/man/XtVaCreatePopupShell.man
new file mode 100644 (file)
index 0000000..d5872aa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtCreatePopupShell.__libmansuffix__
diff --git a/man/XtVaCreateWidget.man b/man/XtVaCreateWidget.man
new file mode 100644 (file)
index 0000000..e3e83b4
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtCreateWidget.__libmansuffix__
diff --git a/man/XtVaGetApplicationResources.man b/man/XtVaGetApplicationResources.man
new file mode 100644 (file)
index 0000000..b249220
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtGetApplicationResources.__libmansuffix__
diff --git a/man/XtVaGetSubresources.man b/man/XtVaGetSubresources.man
new file mode 100644 (file)
index 0000000..a787a72
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtGetSubresources.__libmansuffix__
diff --git a/man/XtVaGetSubvalues.man b/man/XtVaGetSubvalues.man
new file mode 100644 (file)
index 0000000..a7e954e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtSetValues.__libmansuffix__
diff --git a/man/XtVaGetValues.man b/man/XtVaGetValues.man
new file mode 100644 (file)
index 0000000..a7e954e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtSetValues.__libmansuffix__
diff --git a/man/XtVaOpenApplication.man b/man/XtVaOpenApplication.man
new file mode 100644 (file)
index 0000000..e4bf6c0
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtOpenApplication.__libmansuffix__
diff --git a/man/XtVaSetSubvalues.man b/man/XtVaSetSubvalues.man
new file mode 100644 (file)
index 0000000..a7e954e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtSetValues.__libmansuffix__
diff --git a/man/XtVaSetValues.man b/man/XtVaSetValues.man
new file mode 100644 (file)
index 0000000..a7e954e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtSetValues.__libmansuffix__
diff --git a/man/XtWarning.man b/man/XtWarning.man
new file mode 100644 (file)
index 0000000..e65c3f1
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtError.__libmansuffix__
diff --git a/man/XtWarningMsg.man b/man/XtWarningMsg.man
new file mode 100644 (file)
index 0000000..bb7e387
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtErrorMsg.__libmansuffix__
diff --git a/man/XtWidgetToApplicationContext.man b/man/XtWidgetToApplicationContext.man
new file mode 100644 (file)
index 0000000..ae5d5b5
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtCreateApplicationContext.__libmansuffix__
diff --git a/man/XtWindow.man b/man/XtWindow.man
new file mode 100644 (file)
index 0000000..b9e795c
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtDisplay.__libmansuffix__
diff --git a/man/XtWindowOfObject.man b/man/XtWindowOfObject.man
new file mode 100644 (file)
index 0000000..b9e795c
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtDisplay.__libmansuffix__
diff --git a/man/XtWindowToWidget.man b/man/XtWindowToWidget.man
new file mode 100644 (file)
index 0000000..777c44f
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XtNameToWidget.__libmansuffix__
diff --git a/packaging/libXt.spec b/packaging/libXt.spec
new file mode 100644 (file)
index 0000000..7a29c5d
--- /dev/null
@@ -0,0 +1,101 @@
+Summary: X.Org X11 libXt runtime library
+Name: libXt
+Version: 1.1.2
+Release: 2
+License: MIT
+Group: System Environment/Libraries
+URL: http://www.x.org
+
+Source0: %{name}-%{version}.tar.gz
+
+BuildRequires: pkgconfig(xproto) pkgconfig(x11) pkgconfig(sm)
+BuildRequires:  pkgconfig(xorg-macros)
+
+%description
+X.Org X11 libXt runtime library
+
+%package devel
+Summary: X.Org X11 libXt development package
+Group: Development/Libraries
+Requires: %{name} = %{version}-%{release}
+Provides: libxt-devel
+
+%description devel
+X.Org X11 libXt development package
+
+%prep
+%setup -q
+
+%build
+# FIXME: Work around pointer aliasing warnings from compiler for now
+export CFLAGS="${CFLAGS} $RPM_OPT_FLAGS -fno-strict-aliasing"
+%reconfigure --disable-static \
+              LDFLAGS="${LDFLAGS} -Wl,--hash-style=both -Wl,--as-needed" \
+           --with-appdefaultdir=/etc/X11/app-defaults \
+           --with-xfile-search-path="/usr/lib/X11/%L/%T/%N%S:/usr/lib/X11/%l/%T/%N%S:/usr/lib/X11/%T/%N%S:/etc/X11/%L/%T/%N%C%S:/etc/X11/%l/%T/%N%C%S:/etc/X11/%T/%N%C%S:/etc/X11/%L/%T/%N%S:/etc/X11/%l/%T/%N%S:/etc/X11/%T/%N%S"
+
+make %{?jobs:-j%jobs}
+
+%install
+rm -rf $RPM_BUILD_ROOT
+mkdir -p %{buildroot}/usr/share/license
+cp -af COPYING %{buildroot}/usr/share/license/%{name}
+make install DESTDIR=$RPM_BUILD_ROOT
+mkdir -p -m 0755 $RPM_BUILD_ROOT%{_datadir}/X11/app-defaults
+rm -f $RPM_BUILD_ROOT%{_libdir}/*.la
+
+%remove_docs
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%post -p /sbin/ldconfig
+%postun -p /sbin/ldconfig
+
+%files
+%defattr(-,root,root,-)
+/usr/share/license/%{name}
+%doc COPYING ChangeLog
+%{_libdir}/libXt.so.6
+%{_libdir}/libXt.so.6.0.0
+%dir %{_datadir}/X11/app-defaults
+
+%files devel
+%defattr(-,root,root,-)
+#%{_datadir}/doc/%{name}
+%{_includedir}/X11/CallbackI.h
+%{_includedir}/X11/Composite.h
+%{_includedir}/X11/CompositeP.h
+%{_includedir}/X11/ConstrainP.h
+%{_includedir}/X11/Constraint.h
+%{_includedir}/X11/ConvertI.h
+%{_includedir}/X11/Core.h
+%{_includedir}/X11/CoreP.h
+%{_includedir}/X11/CreateI.h
+%{_includedir}/X11/EventI.h
+%{_includedir}/X11/HookObjI.h
+%{_includedir}/X11/InitialI.h
+%{_includedir}/X11/Intrinsic.h
+%{_includedir}/X11/IntrinsicI.h
+%{_includedir}/X11/IntrinsicP.h
+%{_includedir}/X11/Object.h
+%{_includedir}/X11/ObjectP.h
+%{_includedir}/X11/PassivGraI.h
+%{_includedir}/X11/RectObj.h
+%{_includedir}/X11/RectObjP.h
+%{_includedir}/X11/ResConfigP.h
+%{_includedir}/X11/ResourceI.h
+%{_includedir}/X11/SelectionI.h
+%{_includedir}/X11/Shell.h
+%{_includedir}/X11/ShellI.h
+%{_includedir}/X11/ShellP.h
+%{_includedir}/X11/StringDefs.h
+%{_includedir}/X11/ThreadsI.h
+%{_includedir}/X11/TranslateI.h
+%{_includedir}/X11/VarargsI.h
+%{_includedir}/X11/Vendor.h
+%{_includedir}/X11/VendorP.h
+%{_includedir}/X11/Xtos.h
+%{_libdir}/libXt.so
+%{_libdir}/pkgconfig/xt.pc
+#%{_mandir}/man3/*.3*
diff --git a/specs/CH01.xml b/specs/CH01.xml
new file mode 100644 (file)
index 0000000..df2f96f
--- /dev/null
@@ -0,0 +1,2798 @@
+<chapter id='Intrinsics_and_Widgets'>
+<title>Intrinsics and Widgets</title>
+<para>
+The Intrinsics are a programming library tailored to the special requirements
+of user interface construction within a network window system,
+specifically the X Window System.
+The Intrinsics and a widget set make up an X Toolkit.
+</para>
+<sect1 id="Intrinsics">
+<title>Intrinsics</title>
+<para>
+The Intrinsics 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>
+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>
+When the Intrinsics were first conceived, the root of the object
+hierarchy was a widget class named
+Core.
+In Release 4 of the
+Intrinsics, three nonwidget superclasses were added above Core.
+These superclasses are described in <xref linkend='Nonwidget_Objects' />.
+The name of the class
+now at the root of the Intrinsics class hierarchy is
+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 Intrinsics operations.  The argument descriptions
+for each Intrinsics procedure and <xref linkend='Nonwidget_Objects' />
+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>
+</sect1>
+
+<sect1 id="Languages">
+<title>Languages</title>
+<para>
+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>
+Applications that use the Intrinsics mechanisms
+must include the header files
+<function>&lt;X11/Intrinsic.h&gt;</function>
+and
+<function>&lt;X11/StringDefs.h&gt;</function>,
+or their equivalent,
+and they may also include
+<function>&lt;X11/Xatoms.h&gt;</function>
+and
+<function>&lt;X11/Shell.h&gt;</function>.
+In addition, widget implementations should include
+<function>&lt;X11/IntrinsicP.h&gt;</function>
+instead of
+<function>&lt;X11/Intrinsic.h&gt;</function>.
+</para>
+
+<para>
+The applications must also include the additional header files for
+each widget class that they are to use (for example,
+<function>&lt;X11/Xaw/Label.h&gt;</function>
+or
+<function>&lt;X11/Xaw/Scrollbar.h&gt;).</function>
+On a POSIX-based system,
+the Intrinsics object library file is named
+<function>libXt.a</function>
+and is usually referenced as \-lXt when linking the application.
+</para>
+</sect1>
+
+<sect1 id="Procedures_and_Macros">
+<title>Procedures and Macros</title>
+<para>
+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>
+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:
+<xref linkend='XtCheckSubclass' xrefstyle='select: title'/>,
+<xref linkend='XtNew' xrefstyle='select: title'/>,
+<xref linkend='XtNumber' xrefstyle='select: title'/>,
+<xref linkend='XtOffsetOf' xrefstyle='select: title'/>,
+<xref linkend='XtOffset' xrefstyle='select: title'/>,
+and
+<xref linkend='XtSetArg' xrefstyle='select: title'/>.
+</para>
+</sect1>
+
+<sect1 id="Widgets">
+<title>Widgets</title>
+<para>
+The fundamental abstraction and data type of the X Toolkit 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>
+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 <xref linkend='Creating_Widgets' />
+</para>
+
+<para>
+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 <xref linkend='Widget_Classing' />
+The predefined widget classes adhere to these conventions.
+</para>
+
+<para>
+A widget instance is composed of two parts:
+</para>
+<itemizedlist spacing='compact'>
+  <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>
+Much of the input/output of a widget (for example, fonts, colors, sizes,
+or border widths) is customizable by users.
+</para>
+
+<para>
+This chapter discusses the base widget classes,
+Core, Composite, and Constraint, and
+ends with a discussion of widget classing.
+</para>
+<sect2 id="Core_Widgets">
+<title>Core Widgets</title>
+<para>
+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>
+<sect3 id="CoreClassPart_Structure">
+<title>CoreClassPart Structure</title>
+<para>
+All widget classes contain the fields defined in the
+<function>CoreClassPart</function>
+structure.
+</para>
+<literallayout>
+typedef struct {
+     WidgetClass superclass;    See <xref linkend="Widget_Classing" xrefstyle='select: label' />
+     String class_name;         See <xref linkend="Resource_Management" xrefstyle='select: label' />
+     Cardinal widget_size;      See <xref linkend="Widget_Classing" xrefstyle='select: label' />
+     XtProc class_initialize;   See <xref linkend="Widget_Classing" xrefstyle='select: label' />
+     XtWidgetClassProc class_part_initialize;  See <xref linkend="Widget_Classing" xrefstyle='select: label' />
+     XtEnum class_inited;       See <xref linkend="Widget_Classing" xrefstyle='select: label' />
+     XtInitProc initialize;     See <xref linkend='Creating_Widgets' xrefstyle='select: label' />
+     XtArgsProc initialize_hook;  See <xref linkend='Creating_Widgets' xrefstyle='select: label' />
+     XtRealizeProc realize;     See <xref linkend='Realizing_Widgets' xrefstyle='select: label' />
+     XtActionList actions;      See <xref linkend='Translation_Management' xrefstyle='select: label' />
+     Cardinal num_actions;      See <xref linkend='Translation_Management' xrefstyle='select: label' />
+     XtResourceList resources;  See <xref linkend="Resource_Management" xrefstyle='select: label' />
+     Cardinal num_resources;    See <xref linkend="Resource_Management" xrefstyle='select: label' />
+     XrmClass xrm_class;     Private to resource manager
+     Boolean compress_motion;      See <xref linkend='X_Event_Filters' xrefstyle='select: label' />
+     XtEnum compress_exposure;     See <xref linkend='X_Event_Filters' xrefstyle='select: label' />
+     Boolean compress_enterleave;  See <xref linkend='X_Event_Filters' xrefstyle='select: label' />
+     Boolean visible_interest;     See <xref linkend='Widget_Exposure_and_Visibility' xrefstyle='select: label' />
+     XtWidgetProc destroy;         See <xref linkend='Destroying_Widgets' xrefstyle='select: label' />
+     XtWidgetProc resize;          See <xref linkend='Geometry_Management' xrefstyle='select: label' /> 
+     XtExposeProc expose;          See <xref linkend='Widget_Exposure_and_Visibility' xrefstyle='select: label' />
+     XtSetValuesFunc set_values;   See <xref linkend='Reading_and_Writing_Widget_State' xrefstyle='select: label' />
+     XtArgsFunc set_values_hook;   See <xref linkend='Reading_and_Writing_Widget_State' xrefstyle='select: label' />
+     XtAlmostProc set_values_almost;  See <xref linkend='Reading_and_Writing_Widget_State' xrefstyle='select: label' />
+     XtArgsProc get_values_hook;   See <xref linkend='Reading_and_Writing_Widget_State' xrefstyle='select: label' />
+     XtAcceptFocusProc accept_focus;  See <xref linkend='Focusing_Events_on_a_Child' xrefstyle='select: label' />
+     XtVersionType version;        See <xref linkend="Widget_Classing" xrefstyle='select: label' />
+     XtPointer callback_private;  Private to callbacks
+     String tm_table;              See <xref linkend='Translation_Management' xrefstyle='select: label' />
+     XtGeometryHandler query_geometry;  See <xref linkend ='Geometry_Management' xrefstyle='select: label' />
+     XtStringProc display_accelerator;  See <xref linkend='Translation_Management' xrefstyle='select: label' />
+     XtPointer extension;          See <xref linkend="Widget_Classing" xrefstyle='select: label' />
+} CoreClassPart;
+</literallayout>
+<para>
+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>
+<literallayout>
+typedef struct {
+     CoreClassPart core_class;
+} WidgetClassRec, *WidgetClass, CoreClassRec, *CoreWidgetClass;
+</literallayout>
+<para>
+Various routines can cast widget class pointers, as needed,
+to specific widget class types.
+</para>
+
+<para>
+The single occurrences of the class record and pointer for
+creating instances of Core are
+</para>
+
+<para>
+In
+<function>IntrinsicP.h</function>:
+</para>
+<literallayout>
+extern WidgetClassRec widgetClassRec;
+#define coreClassRec widgetClassRec
+</literallayout>
+<para>
+In
+<function>Intrinsic.h</function>:
+</para>
+<literallayout>
+extern WidgetClass widgetClass, coreWidgetClass;
+</literallayout>
+<para>
+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 Intrinsics use
+incomplete structure definitions in
+<function>Intrinsic.h</function>:
+</para>
+<literallayout>
+typedef struct _WidgetClassRec *WidgetClass, *CoreWidgetClass;
+</literallayout>
+</sect3>
+<sect3 id="CorePart_Structure">
+<title>CorePart Structure</title>
+<para>
+All widget instances contain the fields defined in the
+<function>CorePart</function>
+structure.
+</para>
+<literallayout>
+typedef struct _CorePart {
+     Widget self;     Described below
+     WidgetClass widget_class;  See <xref linkend='Widget_Classing' xrefstyle='select: label' />
+     Widget parent;             See <xref linkend='Creating_Widgets' xrefstyle='select: label' />
+     Boolean being_destroyed;   See <xref linkend='Destroying_Widgets' xrefstyle='select: label' />
+     XtCallbackList destroy_callbacks;  <xref linkend='Destroying_Widgets' xrefstyle='select: label' />
+     XtPointer constraints;     See <xref linkend='Constrained_Composite_Widgets' xrefstyle='select: label' />
+     Position x;                See <xref linkend='Geometry_Management' xrefstyle='select: label' />
+     Position y;                See <xref linkend='Geometry_Management' xrefstyle='select: label' />
+     Dimension width;           See <xref linkend='Geometry_Management' xrefstyle='select: label' />
+     Dimension height;          See <xref linkend='Geometry_Management' xrefstyle='select: label' />
+     Dimension border_width;    See <xref linkend='Geometry_Management' xrefstyle='select: label' />
+     Boolean managed;           See <xref linkend='Composite_Widgets_and_Their_Children' xrefstyle='select: label' />
+     Boolean sensitive;         See <xref linkend='Setting_and_Checking_the_Sensitivity_State_of_a_Widget' xrefstyle='select: label' />
+     Boolean ancestor_sensitive;  See <xref linkend='Setting_and_Checking_the_Sensitivity_State_of_a_Widget' xrefstyle='select: label' />
+     XtTranslations accelerators; See <xref linkend='Translation_Management' xrefstyle='select: label' />
+     Pixel border_pixel;        See <xref linkend='Realizing_Widgets' xrefstyle='select: label' />
+     Pixmap border_pixmap;      See <xref linkend='Realizing_Widgets' xrefstyle='select: label' />
+     WidgetList popup_list;     See <xref linkend='Pop_Up_Widgets' xrefstyle='select: label' />
+     Cardinal num_popups;       See <xref linkend='Pop_Up_Widgets' xrefstyle='select: label' />
+     String name;               See <xref linkend='Resource_Management' xrefstyle='select: label' />
+     Screen *screen;            See <xref linkend='Realizing_Widgets' xrefstyle='select: label' />
+     Colormap colormap;         See <xref linkend='Realizing_Widgets' xrefstyle='select: label' />
+     Window window;             See <xref linkend='Realizing_Widgets' xrefstyle='select: label' />
+     Cardinal depth;            See <xref linkend='Realizing_Widgets' xrefstyle='select: label' />
+     Pixel background_pixel;    See <xref linkend='Realizing_Widgets' xrefstyle='select: label' />
+     Pixmap background_pixmap;  See <xref linkend='Realizing_Widgets' xrefstyle='select: label' />
+     Boolean visible;           See <xref linkend='Widget_Exposure_and_Visibility' xrefstyle='select: label' />
+     Boolean mapped_when_managed;  See <xref linkend='Composite_Widgets_and_Their_Children' xrefstyle='select: label' />
+} CorePart;
+</literallayout>
+<para>
+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>
+<literallayout>
+typedef struct {
+     CorePart core;
+} WidgetRec, *Widget, CoreRec, *CoreWidget;
+</literallayout>
+<para>
+Various routines can cast widget pointers, as needed,
+to specific widget types.
+</para>
+
+<para>
+In order to make these types opaque and ensure that the compiler
+does not allow applications to access private data, the Intrinsics use
+incomplete structure definitions in
+<function>Intrinsic.h</function>.
+</para>
+<literallayout>
+typedef struct _WidgetRec *Widget, *CoreWidget;
+</literallayout>
+</sect3>
+<sect3 id="Core_Resources">
+<title>Core Resources</title>
+<para>
+The resource names, classes, and representation types specified in the
+<function>coreClassRec</function>
+resource list are
+</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='1.0*'/>
+  <colspec colname='c3' colwidth='1.0*'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Name</entry>
+      <entry>Class</entry>
+      <entry>Representation</entry>
+    </row>
+  </thead>
+  <tbody>
+    <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>
+  </tbody>
+  </tgroup>
+</informaltable>
+<para>
+Additional resources are defined for all widgets via the
+<function>objectClassRec</function>
+and
+<function>rectObjClassRec</function>
+resource lists; see <xref linkend='Object_Objects' /> and <xref linkend='Rectangle_Objects' /> for details.
+</para>
+</sect3>
+<sect3 id="CorePart_Default_Values">
+<title>CorePart Default Values</title>
+<para>
+The default values for the Core fields, which are filled in by the Intrinsics,
+from the resource lists, and by the initialize procedures, are
+</para>
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='0.4*'/>
+  <colspec colname='c2' colwidth='1.0*'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Field</entry>
+      <entry>Default Value</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>self</entry>
+      <entry>Address of the widget structure (may not be changed).</entry>
+    </row>
+    <row>
+      <entry>widget_class</entry>
+      <entry><emphasis remap='I'>widget_class</emphasis> argument to
+      <xref linkend='XtCreateWidget' xrefstyle='select: title'/>
+      (may not be changed).</entry>
+    </row>
+    <row>
+      <entry>parent</entry>
+      <entry><emphasis remap='I'>parent</emphasis> argument to
+      <xref linkend='XtCreateWidget' xrefstyle='select: title'/>
+      (may not be changed).</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>managed</entry>
+      <entry><function>False</function></entry>
+    </row>
+    <row>
+      <entry>sensitive</entry>
+      <entry><function>True</function></entry>
+    </row>
+    <row>
+      <entry>ancestor_sensitive</entry>
+      <entry>logical AND of parent's <emphasis remap='I'>sensitive</emphasis> and
+      <emphasis remap='I'>ancestor_sensitive</emphasis> values.</entry>
+    </row>
+    <row>
+      <entry>accelerators</entry>
+      <entry>NULL</entry>
+    </row>
+    <row>
+      <entry>border_pixel</entry>
+      <entry><function>XtDefaultForeground</function></entry>
+    </row>
+    <row>
+      <entry>border_pixmap</entry>
+      <entry><function>XtUnspecifiedPixmap</function></entry>
+    </row>
+    <row>
+      <entry>popup_list</entry>
+      <entry>NULL</entry>
+    </row>
+    <row>
+      <entry>num_popups</entry>
+      <entry>0</entry>
+    </row>
+    <row>
+      <entry>name</entry>
+      <entry><emphasis remap='I'>name</emphasis> argument to
+      <xref linkend='XtCreateWidget' xrefstyle='select: title'/>
+      (may not be changed).</entry>
+    </row>
+    <row>
+      <entry>screen</entry>
+      <entry>Parent's <emphasis remap='I'>screen</emphasis>; top-level widget gets screen from display specifier
+      (may not be changed).</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>background_pixel</entry>
+      <entry><function>XtDefaultBackground</function></entry>
+    </row>
+    <row>
+      <entry>background_pixmap</entry>
+      <entry><function>XtUnspecifiedPixmap</function></entry>
+    </row>
+    <row>
+      <entry>visible</entry>
+      <entry><function>True</function></entry>
+    </row>
+    <row>
+      <entry>mapped_when_managed</entry>
+      <entry><function>True</function></entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+<para>
+<function>XtUnspecifiedPixmap</function>
+is a symbolic constant guaranteed to be unequal to
+any valid Pixmap id,
+<function>None</function>,
+and
+<function>ParentRelative</function>.
+</para>
+</sect3>
+</sect2>
+
+<sect2 id="Composite_Widgets">
+<title>Composite Widgets</title>
+<para>
+The Composite
+widget class is a subclass of the
+Core
+widget class (see <xref linkend='Composite_Widgets_and_Their_Children' />).
+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>
+<sect3 id="CompositeClassPart_Structure">
+<title>CompositeClassPart Structure</title>
+<para>
+In addition to the
+Core
+class fields,
+widgets of the Composite class have the following class fields.
+</para>
+<literallayout>
+typedef struct {
+     XtGeometryHandler geometry_manager;  See <xref linkend='Geometry_Management' xrefstyle='select: label' />
+     XtWidgetProc change_managed;   See <xref linkend='Composite_Widgets_and_Their_Children' xrefstyle='select: label' />
+     XtWidgetProc insert_child;     See <xref linkend='Composite_Widgets_and_Their_Children' xrefstyle='select: label' />
+     XtWidgetProc delete_child;     See <xref linkend='Composite_Widgets_and_Their_Children' xrefstyle='select: label' />
+     XtPointer extension;           See <xref linkend='Widget_Classing' xrefstyle='select: label' />
+} CompositeClassPart;
+</literallayout>
+<para>
+The extension record defined for
+<function>CompositeClassPart</function>
+with <emphasis remap='I'>record_type</emphasis>
+equal to
+<emphasis role='strong'>NULLQUARK</emphasis>
+is
+<function>CompositeClassExtensionRec</function>.
+</para>
+<literallayout>
+typedef struct {
+     XtPointer next_extension;  See <xref linkend='Class_Extension_Records' xrefstyle='select: label' />
+     XrmQuark record_type;      See <xref linkend='Class_Extension_Records' xrefstyle='select: label' />
+     long version;              See <xref linkend='Class_Extension_Records' xrefstyle='select: label' />
+     Cardinal record_size;      See <xref linkend='Class_Extension_Records' xrefstyle='select: label' />
+     Boolean accepts_objects;   See <xref linkend='Creating_a_Widget_Instance' xrefstyle='select: label' />
+     Boolean allows_change_managed_set;  See <xref linkend='Bundling_Changes_to_the_Managed_Set' xrefstyle='select: label' />
+} CompositeClassExtensionRec, *CompositeClassExtension;
+</literallayout>
+<para>
+Composite
+classes have the Composite class fields immediately following the
+Core class fields.
+</para>
+<literallayout>
+typedef struct {
+     CoreClassPart core_class;
+     CompositeClassPart composite_class;
+} CompositeClassRec, *CompositeWidgetClass;
+</literallayout>
+<para>
+The single occurrences of the class record and pointer for creating
+instances of Composite are
+</para>
+
+<para>
+In
+<function>IntrinsicP.h</function>:
+</para>
+<literallayout>
+extern CompositeClassRec compositeClassRec;
+</literallayout>
+<para>
+In
+<function>Intrinsic.h</function>:
+</para>
+<literallayout>
+extern WidgetClass compositeWidgetClass;
+</literallayout>
+<para>
+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 <xref linkend='Class_Extension_Records' />).
+<function>Intrinsic.h</function>
+uses an incomplete structure
+definition to ensure that the compiler catches attempts to access
+private data.
+</para>
+<literallayout>
+typedef struct _CompositeClassRec *CompositeWidgetClass;
+</literallayout>
+</sect3>
+<sect3 id="CompositePart_Structure">
+<title>CompositePart Structure</title>
+<para>
+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>
+<literallayout>
+typedef struct {
+     WidgetList children;   See <xref linkend='Composite_Widgets_and_Their_Children' xrefstyle='select: label' />
+     Cardinal num_children; See <xref linkend='Composite_Widgets_and_Their_Children' xrefstyle='select: label' />
+     Cardinal num_slots;    See <xref linkend='Composite_Widgets_and_Their_Children' xrefstyle='select: label' />
+     XtOrderProc insert_position;  See <xref linkend='Insertion_Order_of_Children_The_insert_position_Procedure' xrefstyle='select: label' />
+} CompositePart;
+</literallayout>
+<para>
+Composite
+widgets have the Composite instance fields immediately following the Core
+instance fields.
+</para>
+<literallayout>
+typedef struct {
+     CorePart core;
+     CompositePart composite;
+} CompositeRec, *CompositeWidget;
+</literallayout>
+<para>
+<function>Intrinsic.h</function>
+uses an incomplete structure definition to ensure that the
+compiler catches attempts to access private data.
+</para>
+<literallayout>
+typedef struct _CompositeRec *CompositeWidget;
+</literallayout>
+</sect3>
+<sect3 id="Composite_Resources">
+<title>Composite Resources</title>
+<para>
+The resource names, classes, and representation types
+that are specified in
+the
+<function>compositeClassRec</function>
+resource list are
+</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='1.0*'/>
+  <colspec colname='c3' colwidth='1.0*'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Name</entry>
+      <entry>Class</entry>
+      <entry>Representation</entry>
+    </row>
+  </thead>
+  <tbody>
+    <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>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+</sect3>
+<sect3 id="CompositePart_Default_Values">
+<title>CompositePart Default Values</title>
+<para>
+The default values for the Composite fields,
+which are filled in from the
+Composite
+resource list and by the
+Composite
+initialize procedure, are
+</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <?dbfo table-width="50%" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*' colsep='0'/>
+  <colspec colname='c2' colwidth='1.0*' colsep='0'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Field</entry>
+      <entry>Default Value</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>children</entry><entry>NULL</entry>
+    </row>
+    <row>
+      <entry>num_children</entry><entry>0</entry>
+    </row>
+    <row>
+      <entry>num_slots</entry><entry>0</entry>
+    </row>
+    <row>
+      <entry>insert_position</entry><entry>Internal function to insert at end</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+The <emphasis remap='I'>children</emphasis>, <emphasis remap='I'>num_children</emphasis>,
+and <emphasis remap='I'>insert_position</emphasis> fields are declared
+as resources;
+XtNinsertPosition
+is a settable resource,
+XtNchildren
+and
+XtNnumChildren
+may be read by any client but should only be modified by the composite
+widget class procedures.
+</para>
+</sect3>
+</sect2>
+
+<sect2 id="Constraint_Widgets">
+<title>Constraint Widgets</title>
+<para>
+The Constraint
+widget class is a subclass of the
+Composite
+widget class (see <xref linkend='Constrained_Composite_Widgets' />).  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>
+<sect3 id="ConstraintClassPart_Structure">
+<title>ConstraintClassPart Structure</title>
+<para>
+In addition to the
+Core
+and
+Composite
+class fields,
+widgets of the Constraint class
+have the following class fields.
+</para>
+<literallayout>
+typedef struct {
+     XtResourceList resources;   See <xref linkend='Resource_Management' xrefstyle='select: label' />
+     Cardinal num_resources;     See <xref linkend='Resource_Management' xrefstyle='select: label' />
+     Cardinal constraint_size;   See <xref linkend='Constrained_Composite_Widgets' xrefstyle='select: label' />
+     XtInitProc initialize;      See <xref linkend='Constrained_Composite_Widgets' xrefstyle='select: label' />
+     XtWidgetProc destroy;       See <xref linkend='Constrained_Composite_Widgets' xrefstyle='select: label' />
+     XtSetValuesFunc set_values; See <xref linkend='Setting_Widget_State' xrefstyle='select: label' />
+     XtPointer extension;        See <xref linkend='Widget_Classing' xrefstyle='select: label' />
+} ConstraintClassPart;
+</literallayout>
+<para>
+The extension record defined for
+<function>ConstraintClassPart</function>
+with <emphasis remap='I'>record_type</emphasis> equal to
+<emphasis role='strong'>NULLQUARK</emphasis>
+is
+<function>ConstraintClassExtensionRec</function>.
+</para>
+<literallayout>
+typedef struct {
+     XtPointer next_extension;  See <xref linkend='Class_Extension_Records' xrefstyle='select: label' />
+     XrmQuark record_type;      See <xref linkend='Class_Extension_Records' xrefstyle='select: label' />
+     long version;              See <xref linkend='Class_Extension_Records' xrefstyle='select: label' />
+     Cardinal record_size;      See <xref linkend='Class_Extension_Records' xrefstyle='select: label' />
+     XtArgsProc get_values_hook;  See <xref linkend='Obtaining_Widget_State' xrefstyle='select: label' />
+} ConstraintClassExtensionRec, *ConstraintClassExtension;
+</literallayout>
+<para>
+Constraint
+classes have the Constraint class fields immediately following the
+Composite class fields.
+</para>
+<literallayout>
+typedef struct _ConstraintClassRec {
+     CoreClassPart core_class;
+     CompositeClassPart composite_class;
+     ConstraintClassPart constraint_class;
+} ConstraintClassRec, *ConstraintWidgetClass;
+</literallayout>
+<para>
+The single occurrences of the class record and pointer for creating
+instances of Constraint are
+</para>
+
+<para>
+In
+<function>IntrinsicP.h</function>:
+</para>
+<literallayout>
+extern ConstraintClassRec constraintClassRec;
+</literallayout>
+<para>
+In
+<function>Intrinsic.h</function>:
+</para>
+<literallayout>
+extern WidgetClass constraintWidgetClass;
+</literallayout>
+<para>
+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 <xref linkend='Class_Extension_Records' />).
+<function>Intrinsic.h</function>
+uses an incomplete structure definition to ensure that the
+compiler catches attempts to access private data.
+</para>
+<literallayout>
+typedef struct _ConstraintClassRec *ConstraintWidgetClass;
+</literallayout>
+</sect3>
+<sect3 id="ConstraintPart_Structure">
+<title>ConstraintPart Structure</title>
+<para>
+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>
+<literallayout>
+typedef struct {
+        int empty;
+} ConstraintPart;
+</literallayout>
+<para>
+Constraint
+widgets have the Constraint instance fields immediately following the
+Composite instance fields.
+</para>
+<literallayout>
+typedef struct {
+     CorePart core;
+     CompositePart composite;
+     ConstraintPart constraint;
+} ConstraintRec, *ConstraintWidget;
+</literallayout>
+<para>
+<function>Intrinsic.h</function>
+uses an incomplete structure definition to ensure that the
+compiler catches attempts to access private data.
+</para>
+<literallayout>
+typedef struct _ConstraintRec *ConstraintWidget;
+</literallayout>
+</sect3>
+<sect3 id="Constraint_Resources">
+<title>Constraint Resources</title>
+<para>
+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>
+</sect3>
+</sect2>
+</sect1>
+
+<sect1 id="Implementation_Specific_Types">
+<title>Implementation-Specific Types</title>
+<para>
+To increase the portability of widget and application source code
+between different system environments, the Intrinsics define several
+types whose precise representation is explicitly dependent upon,
+and chosen by, each individual implementation of the Intrinsics.
+</para>
+
+<para>
+These implementation-defined types are
+</para>
+<variablelist>
+  <varlistentry>
+    <term>
+     <emphasis role='strong'>Boolean</emphasis>
+    </term>
+    <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>.
+      </para>
+    </listitem>
+  </varlistentry>
+
+  <varlistentry>
+    <term>
+     <emphasis role='strong'>Cardinal</emphasis>
+    </term>
+    <listitem>
+      <para>
+An unsigned integer datum with a minimum range of [0..2^16-1].
+      </para>
+    </listitem>
+  </varlistentry>
+
+  <varlistentry>
+    <term>
+      <emphasis role='strong'>Dimension</emphasis>
+    </term>
+    <listitem>
+      <para>
+An unsigned integer datum with a minimum range of [0..2^16-1].
+      </para>
+    </listitem>
+  </varlistentry>
+
+  <varlistentry>
+    <term>
+     <emphasis role='strong'>Position</emphasis>
+    </term>
+    <listitem>
+      <para>
+A signed integer datum with a minimum range of [-2^15..2^15-1].
+      </para>
+    </listitem>
+  </varlistentry>
+
+  <varlistentry>
+    <term>
+      <emphasis role='strong'>XtPointer</emphasis>
+    </term>
+    <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*.
+      </para>
+    </listitem>
+  </varlistentry>
+
+  <varlistentry>
+    <term>
+      <emphasis role='strong'>XtArgVal</emphasis>
+    </term>
+    <listitem>
+      <para>
+A datum large enough to contain an
+<function>XtPointer</function>,
+<function>Cardinal</function>,
+<function>Dimension</function>,
+or
+<function>Position</function>
+value.
+      </para>
+    </listitem>
+  </varlistentry>
+
+  <varlistentry>
+    <term>
+      <emphasis role='strong'>XtEnum</emphasis>
+    </term>
+    <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
+<emphasis role='strong'>TRUE</emphasis>
+and
+<emphasis role='strong'>FALSE</emphasis>
+are
+also defined to be equal to
+<function>True</function>
+and
+<function>False</function>,
+respectively.
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+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>
+</sect1>
+
+<sect1 id="Widget_Classing">
+<title>Widget Classing</title>
+<para>
+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>
+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>
+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>
+To make good use of subclassing,
+widget declarations and naming conventions are highly stylized.
+A widget consists of three files:
+</para>
+<itemizedlist spacing='compact'>
+  <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>
+<sect2 id="Widget_Naming_Conventions">
+<title>Widget Naming Conventions</title>
+<para>
+The Intrinsics 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 spacing='compact'>
+  <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>&lt;X11/StringDefs.h&gt;</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>&lt;X11/StringDefs.h&gt;</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>&lt;X11/StringDefs.h&gt;</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:
+    </para>
+  </listitem>
+  <listitem>
+    <itemizedlist spacing='compact'>
+      <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.
+        </para>
+      </listitem>
+    </itemizedlist>
+  </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>
+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>
+</sect2>
+
+<sect2 id="Widget_Subclassing_in_Public_h_Files">
+<title>Widget Subclassing in Public .h Files</title>
+<para>
+The public .h file for a widget class is imported by clients
+and contains
+</para>
+<itemizedlist spacing='compact'>
+  <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>
+For example, the following is the public .h file for a possible
+implementation of a Label widget:
+</para>
+<literallayout>
+#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>
+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>
+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>
+</sect2>
+
+<sect2 id="Widget_Subclassing_in_Private_h_Files">
+<title>Widget Subclassing in Private .h Files</title>
+<para>
+The private .h file for a widget is imported by widget classes that are
+subclasses of the widget and contains
+</para>
+<itemizedlist spacing='compact'>
+  <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>
+For example, the following is the private .h file for a possible Label widget:
+</para>
+<literallayout>
+#ifndef LABELP_H
+#define LABELP_H
+#include &lt;X11/Label.h&gt;
+/* 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>
+<literallayout>
+/* 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>
+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>
+</sect2>
+
+<sect2 id="Widget_Subclassing_in_c_Files">
+<title>Widget Subclassing in .c Files</title>
+<para>
+The .c file for a widget contains the structure initializer
+for the class record variable,
+which contains the following parts:
+</para>
+<itemizedlist spacing='compact'>
+  <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>
+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 <xref linkend='Superclass_Chaining' />,
+<xref linkend='Initializing_a_Widget_Class' />, and 
+<xref linkend='Inheritance_of_Superclass_Operations' />.
+</para>
+
+<para>
+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>
+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>
+The <emphasis remap='I'>version</emphasis> field indicates the toolkit
+implementation version number and is used for
+runtime consistency checking of the X Toolkit 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 Intrinsics 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 Intrinsics interface definition, it may use the symbol
+<function>XtSpecificationRelease</function>,
+as described in <xref linkend='Evolution_of_the_Intrinsics' />.
+Use of
+<function>XtVersion</function>
+allows the Intrinsics implementation to recognize widget binaries
+that were compiled with older implementations.
+</para>
+
+<para>
+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>
+All other fields are described in their respective sections.
+</para>
+
+<para>
+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 <xref linkend='Resource_Management' />.
+</para>
+<literallayout>
+/* 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>
+<literallayout>
+/* Class record constant */
+LabelClassRec labelClassRec = {
+  {
+    /* core_class fields */
+     /* superclass     */     (WidgetClass)&amp;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) &amp;labelClassRec;
+/* New method access routines */
+void LabelSetText(w, text)
+     Widget w;
+     String text;
+{
+     LabelWidgetClass lwc = (Label WidgetClass)XtClass(w);
+     XtCheckSubclass(w, labelWidgetClass, NULL);
+     *(lwc-&gt;label_class.set_text)(w, text)
+}
+/* Private procedures */
+     .
+     .
+     .
+</literallayout>
+</sect2>
+
+<sect2 id="Widget_Class_and_Superclass_Look_Up">
+<title>Widget Class and Superclass Look Up</title>
+<para>
+To obtain the class of a widget, use
+<xref linkend='XtClass' xrefstyle='select: title'/>.
+</para>
+
+
+
+<funcsynopsis id='XtClass'>
+  <funcprototype>
+    <funcdef>WidgetClass <function>XtClass</function></funcdef>
+    <paramdef>Widget<parameter> w</parameter></paramdef>
+  </funcprototype>
+  </funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget. Must be of class Object or any subclass thereof.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+
+<para>
+The
+<xref linkend='XtClass' xrefstyle='select: title'/>
+function returns a pointer to the widget's class structure.
+</para>
+
+<para>
+To obtain the superclass of a widget, use
+<function>XtSuperclass</function>.
+</para>
+
+<!--
+-->
+<funcsynopsis id='XtSuperClass'>
+<funcprototype>
+  <funcdef>WidgetClass <function>XtSuperClass</function></funcdef>
+  <paramdef>Widget<parameter> w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget. Must be of class Object or any subclass thereof.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<!--
+-->
+
+<para>
+The
+<function>XtSuperclass</function>
+function returns a pointer to the widget's superclass class structure.
+</para>
+</sect2>
+
+<sect2 id="Widget_Subclass_Verification">
+<title>Widget Subclass Verification</title>
+<para>
+To check the subclass to which a widget belongs, use
+<xref linkend='XtIsSubclass' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtIsSubclass'>
+<funcprototype>
+  <funcdef>Boolean <function>XtIsSubclass</function></funcdef>
+  <paramdef>Widget<parameter> w</parameter></paramdef>
+  <paramdef>WidgetClass<parameter> widget_class</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget or object instance whose class is to be checked.  Must be of class Object or any subclass thereof.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>widget_class</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget class for which to test. Must be <emphasis role='strong'>objectClass</emphasis> or any subclass thereof.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+
+<para>
+The
+<xref linkend='XtIsSubclass' xrefstyle='select: title'/>
+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
+<xref linkend='XtIsSubclass' xrefstyle='select: title'/>
+to find out if a widget belongs to the desired class of objects.
+</para>
+
+<para>
+To test if a given widget belongs to a subclass of an Intrinsics-defined
+class, the Intrinsics define macros or functions equivalent to
+<xref linkend='XtIsSubclass' xrefstyle='select: title'/>
+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>.
+</para>
+
+<para>
+All these macros and functions have the same argument description.
+</para>
+
+<funcsynopsis id='XtIs'>
+<funcprototype>
+  <funcdef>Boolean <function>XtIs</function></funcdef>
+  <paramdef>Widget<parameter> w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget or object instance whose class is to be checked.  Must be of class Object or any subclass thereof.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+These procedures may be faster than calling
+<xref linkend='XtIsSubclass' xrefstyle='select: title'/>
+directly for the built-in classes.
+</para>
+
+<para>
+To check a widget's class
+and to generate a debugging error message, use
+<xref linkend='XtCheckSubclass' xrefstyle='select: title'/>,
+defined in
+<function>&lt;X11/IntrinsicP.h&gt;</function>:
+</para>
+
+<funcsynopsis id='XtCheckSubclass'>
+<funcprototype>
+  <funcdef>void <function>XtCheckSubclass</function></funcdef>
+  <paramdef>Widget<parameter> w</parameter></paramdef>
+  <paramdef>WidgetClass<parameter> widget_class</parameter></paramdef>
+  <paramdef>String<parameter> message</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget or object whose class is to be checked.  Must be of class Object or any subclass thereof.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>widget_class</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget class for which to test.  Must be <emphasis role='strong'>objectClass</emphasis> or any subclass thereof.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>message</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the message to be used.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtCheckSubclass' xrefstyle='select: title'/>
+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,
+<xref linkend='XtCheckSubclass' xrefstyle='select: title'/>
+constructs an error message from the supplied message,
+the widget's actual class, and the expected class and calls
+<xref linkend='XtErrorMsg' xrefstyle='select: title'/>.
+<xref linkend='XtCheckSubclass' xrefstyle='select: title'/>
+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>
+<xref linkend='XtCheckSubclass' xrefstyle='select: title'/>
+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>
+</sect2>
+
+<sect2 id="Superclass_Chaining">
+<title>Superclass Chaining</title>
+<para>
+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 Intrinsics 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</para>
+<literallayout>
+In all widget classes:           <emphasis remap='I'>class_name</emphasis>
+                                 <emphasis remap='I'>class_initialize</emphasis>
+                                 <emphasis remap='I'>widget_size</emphasis>
+                                 <emphasis remap='I'>realize</emphasis>
+                                 <emphasis remap='I'>visible_interest</emphasis>
+                                 <emphasis remap='I'>resize</emphasis>
+                                 <emphasis remap='I'>expose</emphasis>
+                                 <emphasis remap='I'>accept_focus</emphasis>
+                                 <emphasis remap='I'>compress_motion</emphasis>
+                                 <emphasis remap='I'>compress_exposure</emphasis>
+                                 <emphasis remap='I'>compress_enterleave</emphasis>
+                                 <emphasis remap='I'>set_values_almost</emphasis>
+                                 <emphasis remap='I'>tm_table</emphasis>
+                                 <emphasis remap='I'>version</emphasis>
+                                 <emphasis remap='I'>allocate</emphasis>
+                                 <emphasis remap='I'>deallocate</emphasis>
+
+In Composite widget classes:     <emphasis remap='I'>geometry_manager</emphasis>
+                                 <emphasis remap='I'>change_managed</emphasis>
+                                 <emphasis remap='I'>insert_child</emphasis>
+                                 <emphasis remap='I'>delete_child</emphasis>
+                                 <emphasis remap='I'>accepts_objects</emphasis>
+                                 <emphasis remap='I'>allows_change_managed_set</emphasis>
+
+In Constraint widget classes:    <emphasis remap='I'>constraint_size</emphasis>
+
+In Shell widget classes:         <emphasis remap='I'>root_geometry_manager</emphasis>
+</literallayout>
+
+<para>
+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
+</para>
+<literallayout>
+         <emphasis remap='I'>class_part_initialize</emphasis>
+         <emphasis remap='I'>get_values_hook</emphasis>
+         <emphasis remap='I'>initialize</emphasis>
+         <emphasis remap='I'>initialize_hook</emphasis>
+         <emphasis remap='I'>set_values</emphasis>
+         <emphasis remap='I'>set_values_hook</emphasis>
+         <emphasis remap='I'>resources</emphasis>
+</literallayout>
+
+<para>
+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:
+</para>
+<literallayout>
+     <emphasis remap='I'>resources</emphasis>
+     <emphasis remap='I'>initialize</emphasis>
+     <emphasis remap='I'>set_values</emphasis>
+     <emphasis remap='I'>get_values_hook</emphasis>
+</literallayout>
+
+<para>
+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
+</para>
+<literallayout>
+     <emphasis remap='I'>destroy</emphasis>
+     <emphasis remap='I'>actions</emphasis>
+</literallayout>
+
+<para>
+For subclasses of
+Constraint,
+the following field of
+<function>ConstraintClassPart</function>
+is chained from the subclass up to the
+Constraint class:
+     <emphasis remap='I'>destroy</emphasis>
+</para>
+</sect2>
+
+<sect2 id="Class_Initialization_class_initialize_and_class_part_initialize_Procedures">
+<title>Class Initialization: class_initialize and class_part_initialize Procedures</title>
+<para>
+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>
+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 Intrinsics.
+A class initialization procedure pointer is of type
+<function>XtProc</function>:
+</para>
+
+<para>
+typedef void (*XtProc)(void);
+</para>
+<para>
+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>
+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>.
+</para>
+
+<funcsynopsis>
+<funcprototype>
+  <funcdef>void <function>(*XtWidgetClassProc)(WidgetClass)</function></funcdef>
+  <paramdef>WidgetClass<parameter> widget_class</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+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 <xref linkend='Initializing_a_Widget_Class' />
+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>
+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>
+The first time a widget of a class is created,
+<xref linkend='XtCreateWidget' xrefstyle='select: title'/>
+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 Intrinsics 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>
+The following example provides the class initialization procedure for a Label class.
+</para>
+<literallayout>
+static void ClassInitialize()
+{
+     XtSetTypeConverter(XtRString, XtRJustify, CvtStringToJustify,
+          NULL, 0, XtCacheNone, NULL);
+}
+</literallayout>
+</sect2>
+
+<sect2 id="Initializing_a_Widget_Class">
+<title>Initializing a Widget Class</title>
+<para>
+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
+<xref linkend='XtInitializeWidgetClass' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtInitializeWidgetClass'>
+<funcprototype>
+  <funcdef>void <function>XtInitializeWidgetClass</function></funcdef>
+  <paramdef>WidgetClass<parameter> object_class</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+If the specified widget class is already initialized,
+<xref linkend='XtInitializeWidgetClass' xrefstyle='select: title'/>
+returns immediately.
+</para>
+
+<para>
+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
+<xref linkend='XtInitializeWidgetClass' xrefstyle='select: title'/>
+is called
+(see <xref linkend='Resource_Conversions' />).
+</para>
+</sect2>
+
+<sect2 id="Inheritance_of_Superclass_Operations">
+<title>Inheritance of Superclass Operations</title>
+<para>
+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 spacing='compact'>
+  <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>
+To inherit an operation <emphasis remap='I'>xyz</emphasis>,
+specify the constant
+<function>XtInherit</function> <emphasis remap='I'>Xyz</emphasis>
+in your class record.
+</para>
+
+<para>
+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>
+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 Intrinsics 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>
+For example,
+<function>CompositeP.h</function>
+contains these definitions:
+</para>
+<literallayout>
+#define XtInheritGeometryManager ((XtGeometryHandler) _XtInherit)
+#define XtInheritChangeManaged ((XtWidgetProc) _XtInherit)
+#define XtInheritInsertChild ((XtArgsProc) _XtInherit)
+#define XtInheritDeleteChild ((XtWidgetProc) _XtInherit)
+</literallayout>
+<para>
+Composite's class_part_initialize procedure begins as follows:
+</para>
+<literallayout>
+static void CompositeClassPartInitialize(widgetClass)
+     WidgetClass widgetClass;
+{
+     CompositeWidgetClass wc = (CompositeWidgetClass)widgetClass;
+     CompositeWidgetClass super = (CompositeWidgetClass)wc-&gt;core_class.superclass;
+     if (wc-&gt;composite_class.geometry_manager == XtInheritGeometryManager) {
+         wc-&gt;composite_class.geometry_manager = super-&gt;composite_class.geometry_manager;
+     }
+     if (wc-&gt;composite_class.change_managed == XtInheritChangeManaged) {
+         wc-&gt;composite_class.change_managed = super-&gt;composite_class.change_managed;
+     }
+     .
+     .
+     .
+</literallayout>
+<para>
+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>
+For Object:
+</para>
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+<function>XtInheritAllocate</function>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<function>XtInheritDeallocate</function>
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+For Core:
+</para>
+<itemizedlist spacing='compact'>
+  <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>
+For Composite:
+</para>
+<itemizedlist spacing='compact'>
+  <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>
+For Shell:
+</para>
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+<function>XtInheritRootGeometryManager</function>
+    </para>
+  </listitem>
+</itemizedlist>
+</sect2>
+
+<sect2 id="Invocation_of_Superclass_Operations">
+<title>Invocation of Superclass Operations</title>
+<para>
+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>
+and then calling
+<xref linkend='XtManageChild' xrefstyle='select: title'/>
+to add the child to the managed set.
+</para>
+
+<note>
+<para>
+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.
+</para>
+</note>
+<para>
+This technique is referred to as <emphasis remap='I'>enveloping</emphasis> the superclass's operation.
+</para>
+</sect2>
+
+<sect2 id="Class_Extension_Records">
+<title>Class Extension Records</title>
+<para>
+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>
+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>
+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>
+<literallayout>
+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>
+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
+Intrinsics reserve all record type strings beginning with the two
+characters ``XT'' for future standard uses.  The value
+<emphasis role='strong'>NULLQUARK</emphasis>
+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>
+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>
+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>
+The Intrinsics 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>
+To locate a class extension record, use
+<xref linkend='XtGetClassExtension' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtGetClassExtension'>
+<funcprototype>
+  <funcdef>XtPointer <function>XtGetClassExtension</function></funcdef>
+  <paramdef>WidgetClass<parameter> object_class</parameter></paramdef>
+  <paramdef>Cardinal<parameter> byte_offset</parameter></paramdef>
+  <paramdef>XrmQuark<parameter> type</parameter></paramdef>
+  <paramdef>long<parameter> version</parameter></paramdef>
+  <paramdef>Cardinal<parameter> record_size</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+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.
+<xref linkend='XtGetClassExtension' xrefstyle='select: title'/>
+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.
+</para>
+</sect2>
+</sect1>
+</chapter>
diff --git a/specs/CH02.xml b/specs/CH02.xml
new file mode 100644 (file)
index 0000000..9cfd447
--- /dev/null
@@ -0,0 +1,4538 @@
+<chapter id='Widget_Instantiation'>
+<title>Widget Instantiation</title>
+<para>
+A hierarchy of widget instances constitutes a widget tree.
+The shell widget returned by
+<xref linkend='XtAppCreateShell' xrefstyle='select: title'/>
+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 <xref linkend='Pop_Up_Widgets' />),
+this widget tree instance defines the associated X Window tree.
+</para>
+
+<para>
+Widgets can be either composite or primitive.
+Both kinds of widgets can contain children,
+but the Intrinsics provide a set of management mechanisms for constructing
+and interfacing between composite widgets, their children, and
+other clients.
+</para>
+
+<para>
+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>
+In addition,
+the Intrinsics 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>
+A widget tree is manipulated by several Intrinsics functions.
+For example,
+<xref linkend='XtRealizeWidget' xrefstyle='select: title'/>
+traverses the tree downward and recursively realizes all
+pop-up widgets and children of composite widgets.
+<xref linkend='XtDestroyWidget' xrefstyle='select: title'/>
+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.
+<xref linkend='XtMakeGeometryRequest' xrefstyle='select: title'/>
+traverses the tree up one level and calls the geometry manager
+that is responsible for a widget child's geometry.
+</para>
+
+<para>
+To facilitate upward traversal of the widget tree,
+each widget has a pointer to its parent widget.
+The
+Shell
+widget that
+<xref linkend='XtAppCreateShell' xrefstyle='select: title'/>
+returns has a <emphasis remap='I'>parent</emphasis> pointer of NULL.
+</para>
+
+<para>
+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>
+
+<sect1 id="Initializing_the_tk">
+<title>Initializing the X Toolkit</title>
+<para>
+Before an application can call any Intrinsics function
+other than
+<function>XtSetLanguageProc</function>
+and
+<xref linkend='XtToolkitThreadInitialize' xrefstyle='select: title'/>,
+it must initialize the Intrinsics by using
+</para>
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+<xref linkend='XtToolkitInitialize' xrefstyle='select: title'/>,
+which initializes the Intrinsics internals
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtCreateApplicationContext' xrefstyle='select: title'/>,
+which initializes the per-application state
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>
+or
+<xref linkend='XtOpenDisplay' xrefstyle='select: title'/>,
+which initializes the per-display state
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtAppCreateShell' xrefstyle='select: title'/>,
+which creates the root of a widget tree
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+Or an application can call the convenience procedure
+<xref linkend='XtOpenApplication' xrefstyle='select: title'/>,
+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
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>,
+<xref linkend='XtOpenDisplay' xrefstyle='select: title'/>,
+<xref linkend='XtOpenApplication' xrefstyle='select: title'/>,
+or
+<xref linkend='XtAppInitialize' xrefstyle='select: title'/>.
+</para>
+
+<para>
+Multiple instances of X Toolkit 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.
+To accommodate both requirements,
+the Intrinsics 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 Intrinsics handle all display connections within a single application
+context simultaneously, handling input in a round-robin fashion.
+The application context type
+<function>XtAppContext</function>
+is opaque to clients.
+</para>
+
+<para>
+To initialize the Intrinsics internals, use
+<xref linkend='XtToolkitInitialize' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtToolkitInitialize'>
+<funcprototype>
+  <funcdef>void <function>XtToolkitInitialize</function></funcdef>
+  <paramdef> <parameter></parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+If
+<xref linkend='XtToolkitInitialize' xrefstyle='select: title'/>
+was previously called, it returns immediately.
+When
+<xref linkend='XtToolkitThreadInitialize' xrefstyle='select: title'/>
+is called before
+<xref linkend='XtToolkitInitialize' xrefstyle='select: title'/>,
+the latter is protected against
+simultaneous activation by multiple threads.
+</para>
+
+<para>
+To create an application context, use
+<xref linkend='XtCreateApplicationContext' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtCreateApplicationContext'>
+<funcprototype>
+  <funcdef>XtAppContext <function>XtCreateApplicationContext</function></funcdef>
+  <paramdef> <parameter></parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+
+<para>
+The
+<xref linkend='XtCreateApplicationContext' xrefstyle='select: title'/>
+function returns an application context,
+which is an opaque type.
+Every application must have at least one application context.
+</para>
+
+<para>
+To destroy an application context and close any
+remaining display connections in it, use
+<xref linkend='XtDestroyApplicationContext' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtDestroyApplicationContext'>
+<funcprototype>
+  <funcdef>void <function>XtDestroyApplicationContext</function></funcdef>
+  <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>app_context</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the application context.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtDestroyApplicationContext' xrefstyle='select: title'/>
+function destroys the specified application context.
+If called from within an event dispatch (for example, in a callback procedure),
+<xref linkend='XtDestroyApplicationContext' xrefstyle='select: title'/>
+does not destroy the application context until the dispatch is complete.
+</para>
+
+<para>
+To get the application context in which a given widget was created, use
+<xref linkend='XtWidgetToApplicationContext' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtWidgetToApplicationContext'>
+<funcprototype>
+  <funcdef>XtAppContext <function>XtWidgetToApplicationContext</function></funcdef>
+  <paramdef>Widget <parameter>w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget for which you want the application context.  Must be of class Object or any subclass thereof.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtWidgetToApplicationContext' xrefstyle='select: title'/>
+function returns the application context for the specified widget.
+</para>
+
+<para>
+To initialize a display and add it to an application context, use
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtDisplayInitialize'>
+<funcprototype>
+  <funcdef>void  <function>XtDisplayInitialize</function></funcdef>
+      <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+      <paramdef>Display * <parameter>display</parameter></paramdef>
+      <paramdef>String <parameter>application_name</parameter></paramdef>
+      <paramdef>String <parameter>application_class</parameter></paramdef>
+      <paramdef>XrmOptionDescRec * <parameter>options</parameter></paramdef>
+      <paramdef>Cardinal <parameter>num_options</parameter></paramdef>
+      <paramdef>int * <parameter>argc</parameter></paramdef>
+      <paramdef>String * <parameter>argv</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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 <olink targetdoc='libX11' targetptr='Parsing_Command_Line_Options'>Parsing Command Line Options</olink> in <olink targetdoc='libX11' targetptr='libX11'>Xlib â€” C Language X Interface</olink> and <xref linkend='Parsing_the_Command_Line' /> 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>
+The
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>
+function retrieves the language string to be
+used for the specified display (see <xref linkend='Finding_File_Names' />),
+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>,
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>
+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 <xref linkend='Loading_the_Resource_Database' />
+and <xref linkend='Parsing_the_Command_Line' />
+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>
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>
+calls
+<function>XrmSetDatabase</function>
+to associate the resource database of the default screen with the
+display before returning.
+</para>
+
+<para>
+To open a display, initialize it, and then
+add it to an application context, use
+<xref linkend='XtOpenDisplay' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtOpenDisplay'>
+<funcprototype>
+  <funcdef>Display <function>*XtOpenDisplay</function></funcdef>
+       <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+       <paramdef>String <parameter>display_string</parameter></paramdef>
+       <paramdef>String <parameter>application_name</parameter></paramdef>
+       <paramdef>String <parameter>application_class</parameter></paramdef>
+       <paramdef>XrmOptionDescRec * <parameter>options</parameter></paramdef>
+       <paramdef>Cardinal <parameter>num_options</parameter></paramdef>
+       <paramdef>int * <parameter>argc</parameter></paramdef>
+       <paramdef>String * <parameter>argv</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+
+
+
+<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.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtOpenDisplay' xrefstyle='select: title'/>
+function calls
+<function>XOpenDisplay</function>
+with the specified <emphasis remap='I'>display_string</emphasis>.
+If <emphasis remap='I'>display_string</emphasis> is NULL,
+<xref linkend='XtOpenDisplay' xrefstyle='select: title'/>
+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
+<emphasis role='strong'>DISPLAY</emphasis>
+environment variable.
+</para>
+
+<para>
+If this succeeds,
+<xref linkend='XtOpenDisplay' xrefstyle='select: title'/>
+then calls
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>
+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
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>.
+If <emphasis remap='I'>application_name</emphasis> is NULL and if the environment variable
+<emphasis role='strong'>RESOURCE_NAME</emphasis>
+is set, the value of
+<emphasis role='strong'>RESOURCE_NAME</emphasis>
+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''.
+<xref linkend='XtOpenDisplay' xrefstyle='select: title'/>
+returns the newly opened display or NULL if it failed.
+</para>
+
+<para>
+See <xref linkend='Using_the_Intrinsics_in_a_Multi_Threaded_Environment' />
+for information regarding the use of
+<xref linkend='XtOpenDisplay' xrefstyle='select: title'/>
+in multiple threads.
+</para>
+
+<para>
+To close a display and remove it from an application context, use
+<xref linkend='XtCloseDisplay' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtCloseDisplay'>
+<funcprototype>
+  <funcdef>void <function>XtCloseDisplay</function></funcdef>
+       <paramdef>Display * <parameter>display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the display.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtCloseDisplay' xrefstyle='select: title'/>
+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),
+<xref linkend='XtCloseDisplay' xrefstyle='select: title'/>
+does not close the display until the dispatch is complete.
+Note that applications need only call
+<xref linkend='XtCloseDisplay' xrefstyle='select: title'/>
+if they are to continue executing after closing the display;
+otherwise, they should call
+<xref linkend='XtDestroyApplicationContext' xrefstyle='select: title'/>.
+</para>
+
+<para>
+See <xref linkend='Using_the_Intrinsics_in_a_Multi_Threaded_Environment' />
+for information regarding the use of
+<xref linkend='XtCloseDisplay' xrefstyle='select: title'/>
+in multiple threads.
+</para>
+</sect1>
+
+<sect1 id="Establishing_the_Locale">
+<title>Establishing the Locale</title>
+<para>
+Resource databases are specified to be created in the current process
+locale.  During display initialization prior to creating the
+per-screen resource database, the Intrinsics 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>
+The callout procedure provided by the application is of type
+<function>XtLanguageProc</function>.
+</para>
+
+<funcsynopsis>
+<funcprototype>
+  <funcdef>typedef String <function>(*XtLanguageProc)</function></funcdef>
+  <paramdef>Display <parameter>display</parameter></paramdef>
+  <paramdef>String <parameter>language</parameter></paramdef>
+  <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The language procedure allows an application to set the locale to
+the value of the language resource determined by
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>.
+The function returns a new language string that
+will be subsequently used by
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>
+to establish the path for loading resource files.  The returned
+string  will be copied by the Intrinsics into new memory.
+</para>
+
+<para>
+Initially, no language procedure is set by the Intrinsics.
+To set the language procedure for use by
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>,
+use
+<function>XtSetLanguageProc</function>.
+</para>
+
+<funcsynopsis>
+<funcprototype>
+  <funcdef>XtLanguageProc <function>XtSetLanguageProc</function></funcdef>
+  <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+  <paramdef>XtLanguageProc <parameter>proc</parameter></paramdef>
+  <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+<function>XtSetLanguageProc</function>
+sets the language procedure that will be called from
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>
+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>
+The default language procedure does the following:
+</para>
+<itemizedlist spacing='compact'>
+  <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
+<xref linkend='XtWarning' xrefstyle='select: title'/>.
+    </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
+<xref linkend='XtWarning' xrefstyle='select: title'/>
+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>
+A client wishing to use this mechanism to establish locale can do so
+by calling
+<function>XtSetLanguageProc</function>
+prior to
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>,
+as in the following example.
+</para>
+<literallayout>
+       Widget top;
+       XtSetLanguageProc(NULL, NULL, NULL);
+       top = XtOpenApplication(...);
+       ...
+</literallayout>
+</sect1>
+
+<sect1 id="Loading_the_Resource_Database">
+<title>Loading the Resource Database</title>
+<para>
+The
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>
+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 spacing='compact'>
+  <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
+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>
+When the resource database for a particular screen on the display
+is needed (either internally, or when
+<xref linkend='XtScreenDatabase' xrefstyle='select: title'/>
+is called),
+it is created in the following manner using the sources listed
+above in the same order:
+</para>
+<itemizedlist spacing='compact'>
+  <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>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If a language procedure has been set,
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>
+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,
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>
+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>
+and <emphasis remap='I'>Class</emphasis> are the <emphasis remap='I'>application_name</emphasis> and
+<emphasis remap='I'>application_class</emphasis> specified to
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>.
+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 Intrinsics 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
+<emphasis role='strong'>LANG</emphasis>
+environment variable.  If no language string is
+found, the empty string is used.
+This language string is saved for all future references in the Intrinsics
+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
+<emphasis role='strong'>XENVIRONMENT</emphasis>
+environment variable.
+If this environment variable does not exist, the user's home directory
+is searched for a file named
+<function>.Xdefaults-</function><emphasis>host</emphasis>,
+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
+<xref linkend='XtResolvePathname' xrefstyle='select: title'/>
+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
+<emphasis role='strong'>XUSERFILESEARCHPATH</emphasis>
+if this is defined.  If
+<emphasis role='strong'>XUSERFILESEARCHPATH</emphasis>
+is not defined, an implementation-dependent default value is used.
+This default value is constrained in the following manner:
+    </para>
+  </listitem>
+  <listitem>
+    <itemizedlist spacing='compact'>
+      <listitem>
+        <para>
+If the environment variable
+<emphasis role='strong'>XAPPLRESDIR</emphasis>
+is not defined, the default
+<emphasis role='strong'>XUSERFILESEARCHPATH</emphasis>
+must contain at least six entries.  These entries must contain
+$HOME as the directory prefix, plus the following substitutions:
+        </para>
+<literallayout>
+      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
+</literallayout>
+        <para>
+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
+<emphasis role='strong'>XAPPLRESDIR</emphasis>
+is defined, the default
+<emphasis role='strong'>XUSERFILESEARCHPATH</emphasis>
+must contain at least seven entries.  These entries must contain the
+following directory prefixes and substitutions:
+        </para>
+<literallayout>
+      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
+</literallayout>
+        <para>
+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.
+        </para>
+      </listitem>
+    </itemizedlist>
+  </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
+<xref linkend='XtResolvePathname' xrefstyle='select: title'/>
+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
+<xref linkend='XtAppSetFallbackResources' xrefstyle='select: title'/>.
+Note that the customization substitution string is retrieved
+dynamically by
+<xref linkend='XtResolvePathname' xrefstyle='select: title'/>
+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
+<xref linkend='XtResolvePathname' xrefstyle='select: title'/>,
+the original display-associated database is restored.
+    </para>
+  </listitem>
+</itemizedlist>
+
+<para>
+To obtain the resource database for a particular screen, use
+<xref linkend='XtScreenDatabase' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtScreenDatabase'>
+<funcprototype>
+  <funcdef>XrmDatabase <function>XtScreenDatabase</function></funcdef>
+      <paramdef>Screen * <parameter>screen</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+
+<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>
+The
+<xref linkend='XtScreenDatabase' xrefstyle='select: title'/>
+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
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>,
+the results are undefined.
+</para>
+
+<para>
+To obtain the default resource database associated with a particular display, use
+<xref linkend='XtDatabase' xrefstyle='select: title'/>.
+</para>
+
+
+<funcsynopsis id='XtDatabase'>
+<funcprototype>
+  <funcdef>XrmDatabase <function>XtDatabase</function></funcdef>
+      <paramdef>Display * <parameter>display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the display.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtDatabase' xrefstyle='select: title'/>
+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.
+</para>
+
+<para>
+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
+<xref linkend='XtAppSetFallbackResources' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppSetFallbackResources'>
+<funcprototype>
+  <funcdef>void <function>XtAppSetFallbackResources</function></funcdef>
+      <paramdef>XtAppContext * <parameter>app_context</parameter></paramdef>
+      <paramdef>String * <parameter>specification_list</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+Each entry in <emphasis remap='I'>specification_list</emphasis> points to a string in the format of
+<function>XrmPutLineResource</function>.
+Following a call to
+<xref linkend='XtAppSetFallbackResources' xrefstyle='select: title'/>,
+when a resource database is being created for a particular screen and
+the Intrinsics 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.
+<xref linkend='XtAppSetFallbackResources' xrefstyle='select: title'/>
+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
+<xref linkend='XtAppSetFallbackResources' xrefstyle='select: title'/>
+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>
+</sect1>
+
+<sect1 id="Parsing_the_Command_Line">
+<title>Parsing the Command Line</title>
+<para>
+The
+<xref linkend='XtOpenDisplay' xrefstyle='select: title'/>
+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
+<xref linkend='XtOpenDisplay' xrefstyle='select: title'/>.
+      </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>
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>
+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.
+The format of this table is described in Section 15.9 in <emphasis remap='I'>Xlib â€” C Language X Interface</emphasis>.
+</para>
+<literallayout>
+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>The standard table contains the following entries:</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='4' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <colspec colwidth='1.0*' colname='c3'/>
+  <colspec colwidth='1.0*' colname='c4'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Option String</entry>
+      <entry>Resource Name</entry>
+      <entry>Argument Kind</entry>
+      <entry>Resource Value</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>−background</entry>
+      <entry>*background</entry>
+      <entry>SepArg</entry>
+      <entry>next argument</entry>
+    </row>
+    <row>
+      <entry>−bd</entry>
+      <entry>*borderColor</entry>
+      <entry>SepArg</entry>
+      <entry>next argument</entry>
+    </row>
+    <row>
+      <entry>−bg</entry>
+      <entry>*background</entry>
+      <entry>SepArg</entry>
+      <entry>next argument</entry>
+    </row>
+    <row>
+      <entry>−borderwidth</entry>
+      <entry>.borderWidth</entry>
+      <entry>SepArg</entry>
+      <entry>next argument</entry>
+    </row>
+    <row>
+      <entry>−bordercolor</entry>
+      <entry>*borderColor</entry>
+      <entry>SepArg</entry>
+      <entry>next argument</entry>
+    </row>
+    <row>
+      <entry>−bw</entry>
+      <entry>.borderWidth</entry>
+      <entry>SepArg</entry>
+      <entry>next argument</entry>
+    </row>
+    <row>
+      <entry>−display</entry>
+      <entry>.display</entry>
+      <entry>SepArg</entry>
+      <entry>next argument</entry>
+    </row>
+    <row>
+      <entry>−fg</entry>
+      <entry>*foreground</entry>
+      <entry>SepArg</entry>
+      <entry>next argument</entry>
+    </row>
+    <row>
+      <entry>−fn</entry>
+      <entry>*font</entry>
+      <entry>SepArg</entry>
+      <entry>next argument</entry>
+    </row>
+    <row>
+      <entry>−font</entry>
+      <entry>*font</entry>
+      <entry>SepArg</entry>
+      <entry>next argument</entry>
+    </row>
+    <row>
+      <entry>−foreground</entry>
+      <entry>*foreground</entry>
+      <entry>SepArg</entry>
+      <entry>next argument</entry>
+    </row>
+    <row>
+      <entry>−geometry</entry>
+      <entry>.geometry</entry>
+      <entry>SepArg</entry>
+      <entry>next argument</entry>
+    </row>
+    <row>
+      <entry>−iconic</entry>
+      <entry>.iconic</entry>
+      <entry>NoArg</entry>
+      <entry>"true"</entry>
+    </row>
+    <row>
+      <entry>−name</entry>
+      <entry>.name</entry>
+      <entry>SepArg</entry>
+      <entry>next argument</entry>
+    </row>
+    <row>
+      <entry>−reverse</entry>
+      <entry>.reverseVideo</entry>
+      <entry>NoArg</entry>
+      <entry>"on"</entry>
+    </row>
+    <row>
+      <entry>−rv</entry>
+      <entry>.reverseVideo</entry>
+      <entry>NoArg</entry>
+      <entry>"on"</entry>
+    </row>
+    <row>
+      <entry>+rv</entry>
+      <entry>.reverseVideo</entry>
+      <entry>NoArg</entry>
+      <entry>"off"</entry>
+    </row>
+    <row>
+      <entry>−selectionTimeout</entry>
+      <entry>.selectionTimeout</entry>
+      <entry>SepArg</entry>
+      <entry>next argument</entry>
+    </row>
+    <row>
+      <entry>−synchronous</entry>
+      <entry>.synchronous</entry>
+      <entry>NoArg</entry>
+      <entry>"on"</entry>
+    </row>
+    <row>
+      <entry>+synchronous</entry>
+      <entry>.synchronous</entry>
+      <entry>NoArg</entry>
+      <entry>"off"</entry>
+    </row>
+    <row>
+      <entry>−title</entry>
+      <entry>.title</entry>
+      <entry>SepArg</entry>
+      <entry>next argument</entry>
+    </row>
+    <row>
+      <entry>−xnllanguage</entry>
+      <entry>.xnlLanguage</entry>
+      <entry>SepArg</entry>
+      <entry>next argument</entry>
+    </row>
+    <row>
+      <entry>−xrm</entry>
+      <entry>next argument</entry>
+      <entry>ResArg</entry>
+      <entry>next argument</entry>
+    </row>
+    <row>
+      <entry>−xtsessionID</entry>
+      <entry>.sessionID</entry>
+      <entry>SepArg</entry>
+      <entry>next argument</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+Note that any unique abbreviation for an option name in the standard table
+or in the application table is accepted.
+</para>
+
+<para>
+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>
+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,
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>
+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>
+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>
+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>
+<literallayout>
+xmh -xrm 'xmh*Command.background: red'
+</literallayout>
+<para>
+When it parses the command line,
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>
+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 Intrinsics reserve all option names
+beginning with the characters ``-xt'' for future standard uses.
+</para>
+</sect1>
+
+<sect1 id="Creating_Widgets">
+<title>Creating Widgets</title>
+<para>
+The creation of widget instances is a three-phase process:
+</para>
+
+<orderedlist>
+  <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>
+</orderedlist>
+<para>
+To start the first phase,
+the application calls
+<xref linkend='XtCreateWidget' xrefstyle='select: title'/>
+for all its widgets and adds some (usually, most or all) of its widgets
+to their respective parents' managed set by calling
+<xref linkend='XtManageChild' xrefstyle='select: title'/>.
+To avoid an O(n<superscript>2</superscript>) 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.
+</para>
+
+<para>
+After all widgets have been created,
+the application calls
+<xref linkend='XtRealizeWidget' xrefstyle='select: title'/>
+with the top-level widget to execute the second and third phases.
+<xref linkend='XtRealizeWidget' xrefstyle='select: title'/>
+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>
+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>
+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>
+Finally,
+<xref linkend='XtRealizeWidget' xrefstyle='select: title'/>
+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>
+
+<sect2 id="Creating_and_Merging_Argument_Lists">
+<title>Creating and Merging Argument Lists</title>
+<para>
+Many Intrinsics 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
+</para>
+<literallayout>
+typedef struct {
+       String name;
+       XtArgVal value;
+} Arg, *ArgList;
+</literallayout>
+<para>
+where
+<function>XtArgVal</function>
+is as defined in Section 1.5.
+</para>
+
+<para>
+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>
+To set values in an
+<function>ArgList</function>,
+use
+<xref linkend='XtSetArg' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtSetArg'>
+<funcprototype>
+  <funcdef>void <function>XtSetArg</function></funcdef>
+  <paramdef>Arg <parameter>arg</parameter></paramdef>
+  <paramdef>String <parameter>name</parameter></paramdef>
+  <paramdef>XtArgVal <parameter>value</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+
+<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>
+The
+<xref linkend='XtSetArg' xrefstyle='select: title'/>
+function is usually used in a highly stylized manner to
+minimize the probability of making a mistake; for example:
+</para>
+<literallayout>
+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>
+Alternatively, an application can statically declare the argument list
+and use
+<xref linkend='XtNumber' xrefstyle='select: title'/>:
+</para>
+<literallayout>
+static Args args[] = {
+       {XtNheight, (XtArgVal) 100},
+       {XtNwidth, (XtArgVal) 200},
+};
+XtSetValues(Widget, args, XtNumber(args));
+</literallayout>
+<para>
+Note that you should not use expressions with side effects such as
+auto-increment or auto-decrement
+within the first argument to
+<xref linkend='XtSetArg' xrefstyle='select: title'/>.
+<xref linkend='XtSetArg' xrefstyle='select: title'/>
+can be implemented as a macro that evaluates the first argument twice.
+</para>
+
+<para>
+To merge two
+arglist arrays, use
+<xref linkend='XtMergeArgLists' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtMergeArgLists'>
+<funcprototype>
+  <funcdef>ArgList <function>XtMergeArgLists</function></funcdef>
+     <paramdef>ArgList <parameter>args1</parameter></paramdef>
+     <paramdef>Cardinal <parameter>num_args1</parameter></paramdef>
+     <paramdef>ArgList <parameter>args2</parameter></paramdef>
+     <paramdef>Cardinal <parameter>num_args2</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+
+<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>
+The
+<xref linkend='XtMergeArgLists' xrefstyle='select: title'/>
+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
+<xref linkend='XtFree' xrefstyle='select: title'/>.
+</para>
+
+<para>
+All Intrinsics 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.,
+<xref linkend='XtVaCreateWidget' xrefstyle='select: title'/>.
+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>
+Two special names are defined for use only in varargs lists:
+<function>XtVaTypedArg</function>
+and
+<function>XtVaNestedList</function>.
+</para>
+<literallayout>
+#define XtVaTypedArg "XtVaTypedArg"
+</literallayout>
+<para>
+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 <xref linkend='Resource_Conversions' />) 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.
+</para>
+<literallayout>
+#define XtVaNestedList  "XtVaNestedList"
+</literallayout>
+<para>
+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.
+</para>
+
+<para>
+To dynamically allocate a varargs list for use with
+<function>XtVaNestedList</function>
+in multiple calls, use
+<xref linkend='XtVaCreateArgsList' xrefstyle='select: title'/>.
+</para>
+<literallayout>
+typedef XtPointer XtVarArgsList;
+</literallayout>
+
+<funcsynopsis id='XtVaCreateArgsList'>
+<funcprototype>
+  <funcdef>XtVarArgsList <function>XtVaCreateArgsList</function></funcdef>
+     <paramdef>XtPointer <parameter>unused</parameter></paramdef>
+     <paramdef> <parameter>...</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtVaCreateArgsList' xrefstyle='select: title'/>
+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
+<xref linkend='XtFree' xrefstyle='select: title'/>
+when no longer needed.
+</para>
+
+<para>
+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>
+</sect2>
+
+<sect2 id="Creating_a_Widget_Instance">
+<title>Creating a Widget Instance</title>
+<para>
+To create an instance of a widget, use
+<xref linkend='XtCreateWidget' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtCreateWidget'>
+<funcprototype>
+  <funcdef>Widget <function>XtCreateWidget</function></funcdef>
+      <paramdef>String <parameter>name</parameter></paramdef>
+      <paramdef>WidgetClass <parameter>object_class</parameter></paramdef>
+      <paramdef>Widget <parameter>parent</parameter></paramdef>
+      <paramdef>ArgList <parameter>args</parameter></paramdef>
+      <paramdef>Cardinal <parameter>num_args</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+
+<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.  Must be <emphasis role='strong'>objectClass</emphasis> or any subclass thereof.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>parent</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the parent widget.  Must be of class Object 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>
+The
+<xref linkend='XtCreateWidget' xrefstyle='select: title'/>
+function performs all the boilerplate operations of widget
+creation, doing the following in order:
+</para>
+<itemizedlist spacing='compact'>
+  <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>
+<emphasis role='strong'>NULLQUARK</emphasis>
+or the <emphasis remap='I'>accepts_objects</emphasis> field in the extension
+record is
+<function>False</function>,
+<xref linkend='XtCreateWidget' xrefstyle='select: title'/>
+issues a fatal error; see <xref linkend='Addition_of_Children_to_a_Composite_Widget_The_insert_child_Procedure' /> and <xref linkend='Nonwidget_Objects' />.
+    </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>
+<emphasis role='strong'>NULLQUARK</emphasis>
+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 Intrinsics
+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 <xref linkend='Addition_of_Children_to_a_Composite_Widget_The_insert_child_Procedure' />.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+To create an instance of a widget using varargs lists, use
+<xref linkend='XtVaCreateWidget' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtVaCreateWidget'>
+<funcprototype>
+  <funcdef>Widget <function>XtVaCreateWidget</function></funcdef>
+      <paramdef>String <parameter>name</parameter></paramdef>
+      <paramdef>WidgetClass <parameter>object_class</parameter></paramdef>
+      <paramdef>Widget <parameter>parent</parameter></paramdef>
+      <paramdef> <parameter>...</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+
+<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.  Must be <emphasis role='strong'>objectClass</emphasis> or any subclass thereof.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>parent</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the parent widget.  Must be of class Object 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>
+The
+<xref linkend='XtVaCreateWidget' xrefstyle='select: title'/>
+procedure is identical in function to
+<xref linkend='XtCreateWidget' xrefstyle='select: title'/>
+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="Creating_an_Application_Shell_Instance">
+<title>Creating an Application Shell Instance</title>
+<para>
+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
+<xref linkend='XtAppCreateShell' xrefstyle='select: title'/>
+to create independent widget trees.
+</para>
+
+<funcsynopsis id='XtAppCreateShell'>
+<funcprototype>
+  <funcdef>Widget <function>XtAppCreateShell</function></funcdef>
+      <paramdef>String <parameter>name</parameter></paramdef>
+      <paramdef>String <parameter>application_class</parameter></paramdef>
+      <paramdef>WidgetClass <parameter>widget_class</parameter></paramdef>
+      <paramdef>Display * <parameter>display</parameter></paramdef>
+      <paramdef>ArgList <parameter>args</parameter></paramdef>
+      <paramdef>Cardinal <parameter>num_args</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+
+<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
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>
+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>
+The
+<xref linkend='XtAppCreateShell' xrefstyle='select: title'/>
+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>
+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
+<emphasis role='strong'>WM_CLASS</emphasis>
+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
+<emphasis role='strong'>WM_COMMAND</emphasis>
+property will also be set from the values of the XtNargv and
+XtNargc resources.
+</para>
+
+<para>
+To create multiple top-level shells within a single (logical)
+application,
+you can use one of two methods:
+</para>
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+Designate one shell as the real top-level shell and
+create the others as pop-up children of it by using
+<xref linkend='XtCreatePopupShell' xrefstyle='select: title'/>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Have all shells as pop-up children of an unrealized top-level shell.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+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>
+<literallayout>
+xmail.geometry:...     (the main window)
+xmail.read.geometry:...        (the read window)
+xmail.compose.geometry:...     (the compose window)
+</literallayout>
+<para>
+The second method,
+which is best if there is no main window,
+leads to resource specifications like the following:
+</para>
+<literallayout>
+xmail.headers.geometry:...     (the headers window)
+xmail.read.geometry:...        (the read window)
+xmail.compose.geometry:...     (the compose window)
+</literallayout>
+<para>
+To create a top-level widget that is the root of a widget tree using
+varargs lists, use
+<xref linkend='XtVaAppCreateShell' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtVaAppCreateShell'>
+<funcprototype>
+  <funcdef>Widget <function>XtVaAppCreateShell</function></funcdef>
+      <paramdef>String <parameter>name</parameter></paramdef>
+      <paramdef>String <parameter>application_class</parameter></paramdef>
+      <paramdef>WidgetClass <parameter>widget_class</parameter></paramdef>
+      <paramdef>Display * <parameter>display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>
+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>
+The
+<xref linkend='XtVaAppCreateShell' xrefstyle='select: title'/>
+procedure is identical in function to
+<xref linkend='XtAppCreateShell' xrefstyle='select: title'/>
+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="Convenience_Procedure_to_Initialize_an_Application">
+<title>Convenience Procedure to Initialize an Application</title>
+<para>
+To initialize the Intrinsics internals, create an application context,
+open and initialize a display, and create the initial root shell
+instance, an application may use
+<xref linkend='XtOpenApplication' xrefstyle='select: title'/>
+or
+<xref linkend='XtVaOpenApplication' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtOpenApplication'>
+<funcprototype>
+  <funcdef>Widget <function>XtOpenApplication</function></funcdef>
+      <paramdef>XtAppContext * <parameter>app_context_return</parameter></paramdef>
+      <paramdef>String <parameter>application_class</parameter></paramdef>
+      <paramdef>XrmOptionDescList <parameter>options</parameter></paramdef>
+      <paramdef>Cardinal <parameter>num_options</parameter></paramdef>
+      <paramdef>int * <parameter>argc_in_out</parameter></paramdef>
+      <paramdef>String * <parameter>argv_in_out</parameter></paramdef>
+      <paramdef>String * <parameter>fallback_resources</parameter></paramdef>
+      <paramdef>WidgetClass <parameter>widget_class</parameter></paramdef>
+      <paramdef>ArgList <parameter>args</parameter></paramdef>
+      <paramdef>Cardinal <parameter>num_args</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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.
+      </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>
+The
+<xref linkend='XtOpenApplication' xrefstyle='select: title'/>
+function calls
+<xref linkend='XtToolkitInitialize' xrefstyle='select: title'/>
+followed by
+<xref linkend='XtCreateApplicationContext' xrefstyle='select: title'/>,
+then calls
+<xref linkend='XtOpenDisplay' xrefstyle='select: title'/>
+with <emphasis remap='I'>display_string</emphasis> NULL and
+<emphasis remap='I'>application_name</emphasis> NULL, and finally calls
+<xref linkend='XtAppCreateShell' xrefstyle='select: title'/>
+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
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>
+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
+<xref linkend='XtOpenApplication' xrefstyle='select: title'/>
+terminates the application.  If <emphasis remap='I'>fallback_resources</emphasis> is non-NULL,
+<xref linkend='XtAppSetFallbackResources' xrefstyle='select: title'/>
+is called with the value prior to calling
+<xref linkend='XtOpenDisplay' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtVaOpenApplication'>
+<funcprototype>
+  <funcdef>Widget <function>XtVaOpenApplication</function></funcdef>
+      <paramdef>XtAppContext * <parameter>app_context_return</parameter></paramdef>
+      <paramdef>String <parameter>application_class</parameter></paramdef>
+      <paramdef>XrmOptionDescList <parameter>options</parameter></paramdef>
+      <paramdef>Cardinal <parameter>num_options</parameter></paramdef>
+      <paramdef>int * <parameter>argc_in_out</parameter></paramdef>
+      <paramdef>String * <parameter>argv_in_out</parameter></paramdef>
+      <paramdef>String * <parameter>fallback_resources</parameter></paramdef>
+      <paramdef>WidgetClass <parameter>widget_class</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtVaOpenApplication' xrefstyle='select: title'/>
+procedure is identical in function to
+<xref linkend='XtOpenApplication' xrefstyle='select: title'/>
+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="Widget_Instance_Allocation_The_allocate_Procedure">
+<title>Widget Instance Allocation: The allocate Procedure</title>
+<para>
+A widget class may optionally provide an instance allocation procedure
+in the
+<function>ObjectClassExtension</function>
+record.
+</para>
+
+<para>
+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>
+<literallayout>
+typedef struct {
+       String name;
+       String type;
+       XtArgVal value;
+       int size;
+} XtTypedArg, *XtTypedArgList;
+</literallayout>
+<para>
+The allocate procedure pointer in the
+<function>ObjectClassExtension</function>
+record is of type
+<xref linkend='XtAllocateProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAllocateProc'>
+<funcprototype>
+  <funcdef>typedef void <function>(*AllocateProc)</function></funcdef>
+      <paramdef>WidgetClass <parameter>widget_class</parameter></paramdef>
+      <paramdef>Cardinal* <parameter>constraint_size</parameter></paramdef>
+      <paramdef>Cardinal* <parameter>more_bytes</parameter></paramdef>
+      <paramdef>ArgList <parameter>args</parameter></paramdef>
+      <paramdef>Cardinal* <parameter>num_args</parameter></paramdef>
+      <paramdef>XtTypedArgList <parameter>typed_args</parameter></paramdef>
+      <paramdef>Cardinal* <parameter>num_typed_args</parameter></paramdef>
+      <paramdef>Widget* <parameter>new_return</parameter></paramdef>
+      <paramdef>XtPointer* <parameter>more_bytes_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+At widget allocation time, if an extension record with <emphasis remap='I'>record_type</emphasis>
+equal to
+<emphasis role='strong'>NULLQUARK</emphasis>
+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
+<xref linkend='XtAllocateProc' xrefstyle='select: title'/>
+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
+<emphasis role='strong'>NULLQUARK</emphasis>,
+then
+<function>XtInheritAllocate</function>
+and
+<function>XtInheritDeallocate</function>
+are assumed.
+If no
+<xref linkend='XtAllocateProc' xrefstyle='select: title'/>
+is found, the Intrinsics will allocate memory for the widget.
+</para>
+
+<para>
+An
+<xref linkend='XtAllocateProc' xrefstyle='select: title'/>
+must perform the following:
+</para>
+<itemizedlist spacing='compact'>
+  <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-&gt;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>
+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>
+</sect2>
+
+<sect2 id="Widget_Instance_Initialization_The_initialize_Procedure">
+<title>Widget Instance Initialization: The initialize Procedure</title>
+<para>
+The initialize procedure pointer in a widget class is of type
+<xref linkend='XtInitProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtInitProc'>
+<funcprototype>
+  <funcdef>typedef void <function>(*XtInitProc)</function></funcdef>
+  <paramdef>Widget <parameter>request</parameter></paramdef>
+  <paramdef>Widget <parameter>new</parameter></paramdef>
+  <paramdef>ArgList <parameter>args</parameter></paramdef>
+  <paramdef>Cardinal * <parameter>num_args</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+An initialization procedure performs the following:
+</para>
+<itemizedlist spacing='compact'>
+  <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.
+<note><para>
+It is not necessary to allocate space for or to copy callback lists.
+</para></note>
+    </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.
+<note><para>
+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 <xref linkend='Geometry_Management' />.
+</para></note>
+    </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>
+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>
+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>
+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>
+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>
+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>
+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>
+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>
+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>
+</sect2>
+
+<sect2 id="Constraint_Instance_Initialization_The_ConstraintClassPart_initialize_Procedure">
+<title>Constraint Instance Initialization: The ConstraintClassPart initialize Procedure</title>
+<para>
+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
+<xref linkend='XtInitProc' xrefstyle='select: title'/>.
+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>
+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>
+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>
+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>
+</sect2>
+
+<sect2 id="Nonwidget_Data_Initialization_The_initialize_hook_Procedure">
+<title>Nonwidget Data Initialization: The initialize_hook Procedure</title>
+<note>
+<para>
+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.
+</para>
+</note>
+
+<para>
+The initialize_hook procedure pointer is of type
+<xref linkend='XtArgsProc' xrefstyle='select: title'/>:
+</para>
+
+<funcsynopsis id='XtArgsProc'>
+<funcprototype>
+  <funcdef>typedef void<function>(*XtArgsProc)</function></funcdef>
+  <paramdef>Widget <parameter>w</parameter></paramdef>
+  <paramdef>ArgList <parameter>args</parameter></paramdef>
+  <paramdef>Cardinal * <parameter>num_args</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+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>
+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>
+</sect2>
+</sect1>
+
+<sect1 id="Realizing_Widgets">
+<title>Realizing Widgets</title>
+<para>
+To realize a widget instance, use
+<xref linkend='XtRealizeWidget' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtRealizeWidget'>
+<funcprototype>
+  <funcdef>void <function>XtRealizeWidget</function></funcdef>
+  <paramdef>Widget <parameter>w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget.  Must be of class Core or any subclass thereof.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+If the widget is already realized,
+<xref linkend='XtRealizeWidget' xrefstyle='select: title'/>
+simply returns.
+Otherwise it performs the following:
+</para>
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+Binds all action names in the widget's
+translation table to procedures (see <xref linkend='Action_Names_to_Procedure_Translations' />).
+    </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>,
+<xref linkend='XtRealizeWidget' xrefstyle='select: title'/>
+returns; otherwise it continues and performs the following:
+    </para>
+  </listitem>
+  <listitem>
+    <itemizedlist spacing='compact'>
+      <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.
+        </para>
+      </listitem>
+    </itemizedlist>
+  </listitem>
+</itemizedlist>
+<para>
+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>,
+<xref linkend='XtRealizeWidget' xrefstyle='select: title'/>
+maps the widget window.
+</para>
+
+<para>
+<xref linkend='XtCreateWidget' xrefstyle='select: title'/>,
+<xref linkend='XtVaCreateWidget' xrefstyle='select: title'/>,
+<xref linkend='XtRealizeWidget' xrefstyle='select: title'/>,
+<xref linkend='XtManageChildren' xrefstyle='select: title'/>,
+<function>XtUnmanage\%Children</function>,
+<xref linkend='XtUnrealizeWidget' xrefstyle='select: title'/>,
+<xref linkend='XtSetMappedWhenManaged' xrefstyle='select: title'/>,
+and
+<function>XtDestroy\%Widget</function>
+maintain the following invariants:
+</para>
+<itemizedlist spacing='compact'>
+  <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>
+All Intrinsics 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,
+<xref linkend='XtRealizeWidget' xrefstyle='select: title'/>
+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.
+</para>
+
+<para>
+To check whether or not a widget has been realized, use
+<xref linkend='XtIsRealized' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtIsRealized'>
+<funcprototype>
+  <funcdef>Boolean <function>XtIsRealized</function></funcdef>
+  <paramdef>Widget <parameter>w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget.  Must be of class Object or any subclass thereof.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtIsRealized' xrefstyle='select: title'/>
+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>
+Some widget procedures (for example, set_values) might wish to
+operate differently
+after the widget has been realized.
+</para>
+<sect2 id="Widget_Instance_Window_Creation_The_realize_Procedure">
+<title>Widget Instance Window Creation: The realize Procedure</title>
+<para>
+The realize procedure pointer in a widget class is of type
+<xref linkend='XtRealizeProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtRealizeProc'>
+<funcprototype>
+  <funcdef>typedef void <function>(*XtRealizeProc)</function></funcdef>
+  <paramdef>Widget <parameter>w</parameter></paramdef>
+  <paramdef>XtValueMask <parameter>value_mask</parameter></paramdef>
+  <paramdef>XSetWindowAttributes <parameter>attributes</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The realize procedure must create the widget's window.
+</para>
+
+<para>
+Before calling the class realize procedure, the generic
+<xref linkend='XtRealizeWidget' xrefstyle='select: title'/>
+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 spacing='compact'>
+  <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>
+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>
+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>
+A widget class can inherit its realize procedure from its superclass
+during class initialization.
+The realize procedure defined for
+<function>coreWidgetClass</function>
+calls
+<xref linkend='XtCreateWindow' xrefstyle='select: title'/>
+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 <xref linkend='Inheritance_of_Superclass_Operations' />).
+</para>
+
+<para>
+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>
+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
+<xref linkend='XtRealizeWidget' xrefstyle='select: title'/>
+on its children itself in the appropriate order from within its own
+realize procedure.
+</para>
+
+<para>
+Widgets that have children and whose class is not a subclass of
+<function>compositeWidgetClass</function>
+are responsible for calling
+<xref linkend='XtRealizeWidget' xrefstyle='select: title'/>
+on their children, usually from within the realize procedure.
+</para>
+
+<para>
+Realize procedures cannot manage or unmanage their descendants.
+</para>
+</sect2>
+
+<sect2 id="Window_Creation_Convenience_Routine">
+<title>Window Creation Convenience Routine</title>
+<para>
+Rather than call the Xlib
+<function>XCreateWindow</function>
+function explicitly, a realize procedure should normally call the Intrinsics analog
+<xref linkend='XtCreateWindow' xrefstyle='select: title'/>,
+which simplifies the creation of windows for widgets.
+</para>
+
+<funcsynopsis id='XtCreateWindow'>
+<funcprototype>
+  <funcdef>void <function>XtCreateWindow</function></funcdef>
+  <paramdef>Widget <parameter>w</parameter></paramdef>
+  <paramdef>unsigned int <parameter>window_class</parameter></paramdef>
+  <paramdef>Visual * <parameter>visual</parameter></paramdef>
+  <paramdef>XtValueMask <parameter>value_mask</parameter></paramdef>
+  <paramdef>XSetWindowAttributes <parameter>attributes</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget that defines the additional window attributed.  Must be of class Core or any subclass thereof.
+      </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>
+      </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>
+The
+<xref linkend='XtCreateWindow' xrefstyle='select: title'/>
+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>
+<xref linkend='XtCreateWindow' xrefstyle='select: title'/>
+evaluates the following fields of the widget core
+structure: <emphasis remap='I'>depth</emphasis>, <emphasis remap='I'>screen</emphasis>, <emphasis remap='I'>parent-&gt;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>
+</sect2>
+</sect1>
+
+<sect1 id="Obtaining_Window_Information_from_a_Widget">
+<title>Obtaining Window Information from a Widget</title>
+<para>
+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 <xref linkend='Creating_Widgets' /> and <xref linkend='Realizing_Widgets' />).
+</para>
+
+<para>
+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>
+
+<funcsynopsis>
+<funcprototype>
+  <funcdef>Display <function>XtDisplay</function></funcdef>
+  <paramdef>Widget <parameter>w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget.  Must be of class Core or any subclass thereof.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<function>XtDisplay</function>
+returns the display pointer for the specified widget.
+</para>
+
+<funcsynopsis>
+<funcprototype>
+  <funcdef>Widget <function>XtParent</function></funcdef>
+  <paramdef>Widget <parameter>w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget.  Must be of class Object or any subclass thereof.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<function>XtParent</function>
+returns the parent object for the specified widget. The returned object
+will be of class Object or a subclass.
+</para>
+
+<funcsynopsis id='XtScreen'>
+<funcprototype>
+  <funcdef>Screen <function>*XtScreen</function></funcdef>
+  <paramdef>Widget <parameter>w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget.  Must be of class Core or any subclass thereof.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<xref linkend='XtScreen' xrefstyle='select: title'/>
+returns the screen pointer for the specified widget.
+</para>
+
+<funcsynopsis id='XtWindow'>
+<funcprototype>
+  <funcdef>Window <function>XtWindow</function></funcdef>
+  <paramdef>Widget <parameter>w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget.  Must be of class Core or any subclass thereof.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<xref linkend='XtWindow' xrefstyle='select: title'/>
+returns the window of the specified widget.
+</para>
+
+<para>
+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
+<xref linkend='XtDisplayOfObject' xrefstyle='select: title'/>,
+<xref linkend='XtScreenOfObject' xrefstyle='select: title'/>,
+and
+<xref linkend='XtWindowOfObject' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtDisplayOfObject'>
+<funcprototype>
+  <funcdef>Display <function>*XtDisplayOfObject</function></funcdef>
+  <paramdef>Widget <parameter>w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>object</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the object.  Must be of class Object or any subclass thereof.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<xref linkend='XtDisplayOfObject' xrefstyle='select: title'/>
+is identical in function to
+<function>XtDisplay</function>
+if the object is a widget; otherwise
+<xref linkend='XtDisplayOfObject' xrefstyle='select: title'/>
+returns the display
+pointer for the nearest ancestor of <emphasis remap='I'>object</emphasis> that is of class
+Widget or a subclass thereof.
+</para>
+
+<funcsynopsis id='XtScreenOfObject'>
+<funcprototype>
+  <funcdef>Screen <function>*XtScreenOfObject</function></funcdef>
+  <paramdef>Widget <parameter>object</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>object</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the object.  Must be of class Object or any subclass thereof.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<xref linkend='XtScreenOfObject' xrefstyle='select: title'/>
+is identical in function to
+<xref linkend='XtScreen' xrefstyle='select: title'/>
+if the object is a widget; otherwise
+<xref linkend='XtScreenOfObject' xrefstyle='select: title'/>
+returns the screen pointer
+for the nearest ancestor of <emphasis remap='I'>object</emphasis> that is of class
+Widget or a subclass thereof.
+</para>
+
+<funcsynopsis id='XtWindowOfObject'>
+<funcprototype>
+  <funcdef>Window <function>XtWindowOfObject</function></funcdef>
+  <paramdef>Widget <parameter>object</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>object</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the object.  Must be of class Object or any subclass thereof.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<xref linkend='XtWindowOfObject' xrefstyle='select: title'/>
+is identical in function to
+<xref linkend='XtWindow' xrefstyle='select: title'/>
+if the object is a widget; otherwise
+<xref linkend='XtWindowOfObject' xrefstyle='select: title'/>
+returns the window for the nearest ancestor of <emphasis remap='I'>object</emphasis> that is of class
+Widget or a subclass thereof.
+</para>
+
+<para>
+To retrieve the instance name of an object, use
+<xref linkend='XtName' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtName'>
+<funcprototype>
+  <funcdef>String <function>XtName</function></funcdef>
+  <paramdef>Widget <parameter>object</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>object</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the object whose name is desired.  Must be of class Object or any subclass thereof.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<xref linkend='XtName' xrefstyle='select: title'/>
+returns a pointer to the instance name of the specified object.
+The storage is owned by the Intrinsics and must not be modified.  The
+name is not qualified by the names of any of the object's ancestors.
+</para>
+
+<para>
+Several window attributes are locally cached in the widget instance.
+Thus, they can be set by the resource manager and
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+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
+<xref linkend='XtCreateWindow' xrefstyle='select: title'/>
+call.
+</para>
+
+<para>
+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 Intrinsics.
+When an
+<function>XConfigureWindow</function>
+is issued by the Intrinsics 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 <xref linkend='Geometry_Management' />).
+</para>
+<sect2 id="Unrealizing_Widgets">
+<title>Unrealizing Widgets</title>
+<para>
+To destroy the windows associated with a widget and its
+non-pop-up descendants, use
+<xref linkend='XtUnrealizeWidget' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtUnrealizeWidget'>
+<funcprototype>
+  <funcdef>void <function>XtUnrealizeWidget</function></funcdef>
+  <paramdef>Widget <parameter>w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget.  Must be of class Core or any subclass thereof.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+If the widget is currently unrealized,
+<xref linkend='XtUnrealizeWidget' xrefstyle='select: title'/>
+simply returns.  Otherwise it performs the following:
+</para>
+<itemizedlist spacing='compact'>
+  <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
+XtNunrealizeCallback
+list.
+    </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>
+Any events in the queue or which arrive following a call to
+<xref linkend='XtUnrealizeWidget' xrefstyle='select: title'/>
+will be dispatched as if the window(s) of the
+unrealized widget(s) had never existed.
+</para>
+</sect2>
+</sect1>
+
+<sect1 id="Destroying_Widgets">
+<title>Destroying Widgets</title>
+<para>
+The Intrinsics provide support
+</para>
+<itemizedlist spacing='compact'>
+  <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.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+To destroy a widget instance, use
+<xref linkend='XtDestroyWidget' xrefstyle='select: title'/>.
+</para>
+
+
+<funcsynopsis id='XtDestroyWidget'>
+<funcprototype>
+  <funcdef>void <function>XtDestroyWidget</function></funcdef>
+  <paramdef>Widget <parameter>w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget.  Must be of class Object or any subclass thereof.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtDestroyWidget' xrefstyle='select: title'/>
+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>
+In phase 1,
+<xref linkend='XtDestroyWidget' xrefstyle='select: title'/>
+performs the following:
+</para>
+<itemizedlist spacing='compact'>
+  <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>
+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>
+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
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>
+is about to return, or immediately if not in
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>.
+</para>
+
+<para>
+In phase 2,
+<xref linkend='XtDestroyWidget' xrefstyle='select: title'/>
+performs the following on each entry in the destroy list in the order
+specified:
+</para>
+<itemizedlist spacing='compact'>
+  <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
+<xref linkend='XtUnmanageChild' xrefstyle='select: title'/>
+on the widget and then calls the widget's parent's delete_child procedure
+(see <xref linkend='Deletion_of_Children_The_delete_child_Procedure' />).
+    </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>
+The
+<xref linkend='XtDestroyWidget' xrefstyle='select: title'/>
+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 spacing='compact'>
+  <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
+<emphasis role='strong'>NULLQUARK</emphasis>
+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 Intrinsics 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>
+<sect2 id="Adding_and_Removing_Destroy_Callbacks">
+<title>Adding and Removing Destroy Callbacks</title>
+<para>
+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
+<xref linkend='Callbacks' />.
+The destroy callback list is identified by the resource name
+XtNdestroyCallback.
+</para>
+
+<para>
+For example, the following adds an application-supplied destroy callback
+procedure <emphasis remap='I'>ClientDestroy</emphasis> with client data to a widget by calling
+<xref linkend='XtAddCallback' xrefstyle='select: title'/>.
+</para>
+
+<literallayout>
+XtAddCallback(<emphasis remap='I'>w</emphasis>, XtNdestroyCallback, <emphasis remap='I'>ClientDestroy</emphasis>, <emphasis remap='I'>client_data</emphasis>)
+</literallayout>
+
+<para>
+Similarly, the following removes the application-supplied destroy callback
+procedure <emphasis remap='I'>ClientDestroy</emphasis> by calling
+<xref linkend='XtRemoveCallback' xrefstyle='select: title'/>.
+</para>
+
+<literallayout>
+XtRemoveCallback(<emphasis remap='I'>w</emphasis>, XtNdestroyCallback, <emphasis remap='I'>ClientDestroy</emphasis>, <emphasis remap='I'>client_data</emphasis>)
+</literallayout>
+<para>
+The <emphasis remap='I'>ClientDestroy</emphasis> argument is of type
+<xref linkend='XtCallbackProc' xrefstyle='select: title'/>;
+see <xref linkend='Using_Callback_Procedure_and_Callback_List_Definitions' />.
+</para>
+</sect2>
+
+<sect2 id="Dynamic_Data_Deallocation_The_destroy_Procedure">
+<title>Dynamic Data Deallocation: The destroy Procedure</title>
+<para>
+The destroy procedure pointers in the
+<function>ObjectClassPart</function>,
+<function>RectObjClassPart</function>,
+and
+<function>CoreClassPart</function>
+structures are of type
+<xref linkend='XtWidgetProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtWidgetProc'>
+<funcprototype>
+  <funcdef>typedef void <function>XtWidgetProc</function></funcdef>
+  <paramdef>Widget <parameter>w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget being destroyed.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+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>
+Deallocating storage includes, but is not limited to,
+the following steps:
+</para>
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+Calling
+<xref linkend='XtFree' xrefstyle='select: title'/>
+on dynamic storage allocated with
+<xref linkend='XtMalloc' xrefstyle='select: title'/>,
+<xref linkend='XtCalloc' xrefstyle='select: title'/>,
+and so on.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Calling
+<function>XFreePixmap</function>
+on pixmaps created with direct X calls.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Calling
+<xref linkend='XtReleaseGC' xrefstyle='select: title'/>
+on GCs allocated with
+<xref linkend='XtGetGC' xrefstyle='select: title'/>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Calling
+<function>XFreeGC</function>
+on GCs allocated with direct X calls.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Calling
+<xref linkend='XtRemoveEventHandler' xrefstyle='select: title'/>
+on event handlers added to other widgets.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Calling
+<xref linkend='XtRemoveTimeOut' xrefstyle='select: title'/>
+on timers created with
+<xref linkend='XtAppAddTimeOut' xrefstyle='select: title'/>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Calling
+<xref linkend='XtDestroyWidget' xrefstyle='select: title'/>
+for each child if the widget has children
+and is not a subclass of
+<function>compositeWidgetClass</function>.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+During destroy phase 2 for each widget, the Intrinsics 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>
+</sect2>
+
+<sect2 id="Dynamic_Constraint_Data_Deallocation_The_ConstraintClassPart_destroy_Procedure">
+<title>Dynamic Constraint Data Deallocation: The ConstraintClassPart destroy Procedure</title>
+<para>
+The constraint destroy procedure identified in the
+<function>ConstraintClassPart</function>
+<function>constraintWidgetClass</function>.
+This constraint destroy procedure pointer is of type
+<xref linkend='XtWidgetProc' xrefstyle='select: title'/>.
+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>
+If a parent does not need to deallocate any constraint storage,
+the constraint destroy procedure entry
+in its class record can be NULL.
+</para>
+</sect2>
+
+<sect2 id="Widget_Instance_Deallocation_The_deallocate_Procedure">
+<title>Widget Instance Deallocation: The deallocate Procedure</title>
+<para>
+The deallocate procedure pointer in the
+<function>ObjectClassExtension</function>
+record is of type
+<function>XtDeallocateProc</function>.
+</para>
+
+<funcsynopsis>
+<funcprototype>
+  <funcdef>typedef void <function>(*XtDeallocateProc)</function></funcdef>
+  <paramdef>Widget <parameter>widget</parameter></paramdef>
+  <paramdef>XtPointer <parameter>more_bytes</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+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>
+<emphasis role='strong'>NULLQUARK</emphasis>
+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
+<emphasis role='strong'>NULLQUARK</emphasis>,
+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>
+If no
+<function>XtDeallocateProc</function>
+is found, it is assumed that the Intrinsics
+originally allocated the memory and is responsible for freeing it.
+</para>
+</sect2>
+</sect1>
+
+<sect1 id="Exiting_from_an_Application">
+<title>Exiting from an Application</title>
+<para>
+All X Toolkit applications should terminate
+by calling
+<xref linkend='XtDestroyApplicationContext' xrefstyle='select: title'/>
+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
+<xref linkend='XtUnmapWidget' xrefstyle='select: title'/>
+on each top-level shell widget.
+The Intrinsics 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>
+Depending upon the widget set in use, it may be necessary to explicitly
+destroy individual widgets or widget trees with
+<xref linkend='XtDestroyWidget' xrefstyle='select: title'/>
+before calling
+<xref linkend='XtDestroyApplicationContext' xrefstyle='select: title'/>
+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 <xref linkend='Session_Participation' />), then the client may wish to resign from the session
+before exiting.  See <xref linkend='Resigning_from_a_Session' /> for details.
+</para>
+</sect1>
+</chapter>
diff --git a/specs/CH03.xml b/specs/CH03.xml
new file mode 100644 (file)
index 0000000..2b2e1d7
--- /dev/null
@@ -0,0 +1,1406 @@
+<chapter id='Composite_Widgets_and_Their_Children'>
+<title>Composite Widgets and Their Children</title>
+<para>
+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 Intrinsics functions) include:
+</para>
+<itemizedlist spacing='compact'>
+  <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>
+Overall management is handled by the generic procedures
+<xref linkend='XtCreateWidget' xrefstyle='select: title'/>
+and
+<xref linkend='XtDestroyWidget' xrefstyle='select: title'/>.
+<xref linkend='XtCreateWidget' xrefstyle='select: title'/>
+adds children to their parent by calling the parent's insert_child
+procedure.
+<xref linkend='XtDestroyWidget' xrefstyle='select: title'/>
+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>
+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 Intrinsics.
+</para>
+
+<para>
+Children are added to and removed from their parent's managed set by using
+<xref linkend='XtManageChild' xrefstyle='select: title'/>,
+<xref linkend='XtManageChildren' xrefstyle='select: title'/>,
+<xref linkend='XtUnmanageChild' xrefstyle='select: title'/>,
+<xref linkend='XtUnmanageChildren' xrefstyle='select: title'/>,
+and
+<xref linkend='XtChangeManagedSet' xrefstyle='select: title'/>,
+which notify the parent to recalculate the physical layout of its children
+by calling the parent's change_managed procedure.
+The
+<xref linkend='XtCreateManagedWidget' xrefstyle='select: title'/>
+convenience function calls
+<xref linkend='XtCreateWidget' xrefstyle='select: title'/>
+and
+<xref linkend='XtManageChild' xrefstyle='select: title'/>
+on the result.
+</para>
+
+<para>
+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
+<xref linkend='XtSetMappedWhenManaged' xrefstyle='select: title'/>.
+</para>
+
+<para>
+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 boxes</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 boxes</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 boxes</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 boxes</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>
+<sect1 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>
+<para>
+To add a child to
+the parent's list of children, the
+<xref linkend='XtCreateWidget' xrefstyle='select: title'/>
+function calls the parent's class routine insert_child.
+The insert_child procedure pointer in a composite widget is of type
+<xref linkend='XtWidgetProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtWidgetProc_2'>
+<funcprototype>
+<funcdef>typedef void <function>(*XtWidgetProc)</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Passes the newly created child.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+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>
+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 <xref linkend='Nonwidget_Objects' />) must specify a
+<function>CompositeClassExtension</function>
+extension record as described
+in <xref linkend='CompositeClassPart_Structure' />
+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>
+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>
+</sect1>
+
+<sect1 id="Insertion_Order_of_Children_The_insert_position_Procedure">
+<title>Insertion Order of Children: The insert_position Procedure</title>
+<para>
+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>
+An application controls the presentation order of a set of children by
+supplying an
+XtNinsertPosition
+resource.
+The insert_position procedure pointer in a composite widget instance is of type
+<xref linkend='XtOrderProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtOrderProc'>
+<funcprototype>
+<funcdef>typedef Cardinal <function>(*XtOrderProc)</function></funcdef>
+
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Passes the newly created widget.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+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>
+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>
+</sect1>
+
+<sect1 id="Deletion_of_Children_The_delete_child_Procedure">
+<title>Deletion of Children: The delete_child Procedure</title>
+
+<para>
+To remove the child from the parent's <emphasis remap='I'>children</emphasis> list, the
+<xref linkend='XtDestroyWidget' xrefstyle='select: title'/>
+function eventually causes a call to the Composite parent's class delete_child
+procedure.
+The delete_child procedure pointer is of type
+<xref linkend='XtWidgetProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='_XtWidgetProc'>
+<funcprototype>
+<funcdef>typedef void <function>(*XtWidgetProc)</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Passes the child being deleted.
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+
+
+<para>
+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>
+</sect1>
+
+<sect1 id="Adding_and_Removing_Children_from_the_Managed_Set">
+<title>Adding and Removing Children from the Managed Set</title>
+<para>
+The Intrinsics 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.
+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
+<xref linkend='XtWidgetProc' xrefstyle='select: title'/>.
+The widget argument specifies the composite widget whose managed child
+set has been modified.
+</para>
+
+<sect2 id="Managing_Children">
+<title>Managing Children</title>
+<para>
+To add a list of widgets to the geometry-managed (and hence displayable)
+subset of their Composite parent, use
+<xref linkend='XtManageChildren' xrefstyle='select: title'/>.
+</para>
+
+<para>typedef Widget *WidgetList;</para>
+
+<funcsynopsis id='XtManageChildren'>
+<funcprototype>
+<funcdef>void <function>XtManageChildren</function></funcdef>
+   <paramdef>WidgetList <parameter>children</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_children</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtManageChildren' xrefstyle='select: title'/>
+function performs the following:
+</para>
+<itemizedlist spacing='compact'>
+  <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,
+<xref linkend='XtManageChildren' xrefstyle='select: title'/>
+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:
+    </para>
+  </listitem>
+  <listitem>
+    <itemizedlist spacing='compact'>
+      <listitem>
+        <para>
+Calls the change_managed routine of the widgets' parent.
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+Calls
+<xref linkend='XtRealizeWidget' xrefstyle='select: title'/>
+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>.
+        </para>
+      </listitem>
+    </itemizedlist>
+  </listitem>
+</itemizedlist>
+<para>
+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
+<xref linkend='XtManageChild' xrefstyle='select: title'/>
+from their insert_child procedure.
+</para>
+
+<para>
+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
+<xref linkend='XtMoveWidget' xrefstyle='select: title'/>,
+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>
+If the composite widget wishes to change the size or border width of any of
+its children, it calls
+<xref linkend='XtResizeWidget' xrefstyle='select: title'/>,
+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
+<xref linkend='XtConfigureWidget' xrefstyle='select: title'/>;
+see <xref linkend='Widget_Placement_and_Sizing' />.
+</para>
+
+<para>
+To add a single child to its parent widget's set of managed children, use
+<xref linkend='XtManageChild' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtManageChild'>
+<funcprototype>
+<funcdef>void <function>XtManageChild</function></funcdef>
+   <paramdef>Widget <parameter>child</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>child</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the child.  Must be of class RectObj or any subclass thereof.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtManageChild' xrefstyle='select: title'/>
+function constructs a
+<function>WidgetList</function>
+of length 1 and calls
+<xref linkend='XtManageChildren' xrefstyle='select: title'/>.
+</para>
+
+<para>
+To create and manage a child widget in a single procedure, use
+<xref linkend='XtCreateManagedWidget' xrefstyle='select: title'/>
+or
+<xref linkend='XtVaCreateManagedWidget' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtCreateManagedWidget'>
+<funcprototype>
+<funcdef>Widget <function>XtCreateManagedWidget</function></funcdef>
+   <paramdef>String <parameter>name</parameter></paramdef>
+   <paramdef>WidgetClass <parameter>widget_class</parameter></paramdef>
+   <paramdef>Widget <parameter>parent</parameter></paramdef>
+   <paramdef>ArgList <parameter>args</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_args</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtCreateManagedWidget' xrefstyle='select: title'/>
+function is a convenience routine that calls
+<xref linkend='XtCreateWidget' xrefstyle='select: title'/>
+and
+<xref linkend='XtManageChild' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtVaCreateManagedWidget'>
+<funcprototype>
+<funcdef>Widget <function>XtVaCreateManagedWidget</function></funcdef>
+   <paramdef>String <parameter>name</parameter></paramdef>
+   <paramdef>WidgetClass <parameter>widget_class</parameter></paramdef>
+   <paramdef>Widget <parameter>parent</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+<xref linkend='XtVaCreateManagedWidget' xrefstyle='select: title'/>
+is identical in function to
+<xref linkend='XtCreateManagedWidget' xrefstyle='select: title'/>
+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="Unmanaging_Children">
+<title>Unmanaging Children</title>
+<para>
+To remove a list of children from a parent widget's managed list, use
+<xref linkend='XtUnmanageChildren' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtUnmanageChildren'>
+<funcprototype>
+<funcdef>void <function>XtUnmanageChildren</function></funcdef>
+   <paramdef>WidgetList <parameter>children</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_children</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtUnmanageChildren' xrefstyle='select: title'/>
+function performs the following:
+</para>
+<itemizedlist spacing='compact'>
+  <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,
+<xref linkend='XtUnmanageChildren' xrefstyle='select: title'/>
+ignores the child if it is unmanaged; otherwise it performs the following:
+    </para>
+  </listitem>
+  <listitem>
+    <itemizedlist spacing='compact'>
+      <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.
+        </para>
+      </listitem>
+    </itemizedlist>
+  </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>
+<xref linkend='XtUnmanageChildren' xrefstyle='select: title'/>
+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,
+<xref linkend='XtDestroyWidget' xrefstyle='select: title'/>
+should be called instead;
+see <xref linkend='Exiting_from_an_Application' />.
+</para>
+
+<para>
+To remove a single child from its parent widget's managed set, use
+<xref linkend='XtUnmanageChild' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtUnmanageChild'>
+<funcprototype>
+<funcdef>void <function>XtUnmanageChild</function></funcdef>
+   <paramdef>Widget <parameter>child</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>child</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the child.  Must be of class RectObj or any subclass thereof.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtUnmanageChild' xrefstyle='select: title'/>
+function constructs a widget list
+of length 1 and calls
+<xref linkend='XtUnmanageChildren' xrefstyle='select: title'/>.
+</para>
+
+<para>
+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>
+</sect2>
+
+<sect2 id="Bundling_Changes_to_the_Managed_Set">
+<title>Bundling Changes to the Managed Set</title>
+<para>
+A client may simultaneously unmanage and manage children
+with a single call to the Intrinsics.  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.
+</para>
+
+<para>
+To simultaneously remove from and add to the geometry-managed
+set of children of a composite parent, use
+<xref linkend='XtChangeManagedSet' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtChangeManagedSet'>
+<funcprototype>
+<funcdef>void <function>XtChangeManagedSet</function></funcdef>
+   <paramdef>WidgetList <parameter>unmanage_children</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_unmanage_children</parameter></paramdef>
+   <paramdef>XtDoChangeProc <parameter>do_change_proc</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+   <paramdef>WidgetList <parameter>manage_children</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_manage_children</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtChangeManagedSet' xrefstyle='select: title'/>
+function performs the following:
+</para>
+<itemizedlist spacing='compact'>
+  <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
+<xref linkend='XtChangeManagedSet' xrefstyle='select: title'/>
+performs the following:
+    </para>
+  </listitem>
+  <listitem>
+    <itemizedlist spacing='compact'>
+      <listitem>
+        <para>
+Calls
+<xref linkend='XtUnmanageChildren' xrefstyle='select: title'/>
+(<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
+<xref linkend='XtManageChildren' xrefstyle='select: title'/>
+(<emphasis remap='I'>manage_children</emphasis>, <emphasis remap='I'>num_manage_children</emphasis>).
+        </para>
+      </listitem>
+    </itemizedlist>
+  </listitem>
+  <listitem>
+    <para>
+Otherwise, the following is performed:
+    </para>
+  </listitem>
+  <listitem>
+    <itemizedlist spacing='compact'>
+      <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
+<xref linkend='XtRealizeWidget' xrefstyle='select: title'/>
+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>.
+        </para>
+      </listitem>
+    </itemizedlist>
+  </listitem>
+</itemizedlist>
+<para>
+If no
+<function>CompositeClassExtension</function>
+record is found in the parent's composite class part <emphasis remap='I'>extension</emphasis> field
+with record type
+<emphasis role='strong'>NULLQUARK</emphasis>
+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>
+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.
+</para>
+
+<para>
+The <emphasis remap='I'>do_change_proc</emphasis> is of type
+<xref linkend='XtDoChangeProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtDoChangeProc'>
+<funcprototype>
+<funcdef>typedef void <function>*XtDoChangeProc</function></funcdef>
+
+   <paramdef>Widget <parameter>composite_parent</parameter></paramdef>
+   <paramdef>WidgetList <parameter>unmange_children</parameter></paramdef>
+   <paramdef>Cardinal *<parameter>num_unmanage_children</parameter></paramdef>
+   <paramdef>WidgetList <parameter>manage_children</parameter></paramdef>
+   <paramdef>Cardinal *<parameter>num_manage_children</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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
+<xref linkend='XtChangeManagedSet' xrefstyle='select: title'/>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The <emphasis remap='I'>do_change_proc</emphasis> procedure is used by the caller of
+<xref linkend='XtChangeManagedSet' xrefstyle='select: title'/>
+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
+<xref linkend='XtChangeManagedSet' xrefstyle='select: title'/>
+may take advantage of the fact that the Intrinsics 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>
+</sect2>
+
+<sect2 id="Determining_if_a_Widget_Is_Managed">
+<title>Determining if a Widget Is Managed</title>
+<para>
+To determine the managed state of a given child widget, use
+<xref linkend='XtIsManaged' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtIsManaged'>
+<funcprototype>
+<funcdef>Boolean <function>XtIsManaged</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget.  Must be of class Object or any subclass thereof.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtIsManaged' xrefstyle='select: title'/>
+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>
+</sect2>
+</sect1>
+
+<sect1 id="Controlling_When_Widgets_Get_Mapped">
+<title>Controlling When Widgets Get Mapped</title>
+<para>
+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>.
+</para>
+
+<para>
+To change the value of a given widget's <emphasis remap='I'>map_when_managed</emphasis> field, use
+<xref linkend='XtSetMappedWhenManaged' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtSetMappedWhenManaged'>
+<funcprototype>
+<funcdef>void <function>XtSetMappedWhenManaged</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>Boolean <parameter>map_when_managed</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget.  Must be of class Core or any subclass thereof.
+      </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>
+If the widget is realized and managed,
+and if <emphasis remap='I'>map_when_managed</emphasis> is
+<function>True</function>,
+<xref linkend='XtSetMappedWhenManaged' xrefstyle='select: title'/>
+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.
+<xref linkend='XtSetMappedWhenManaged' xrefstyle='select: title'/>
+is a convenience function that is equivalent to (but slightly faster than)
+calling
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+and setting the new value for the XtNmappedWhenManaged resource
+then mapping the widget as appropriate.
+As an alternative to using
+<xref linkend='XtSetMappedWhenManaged' xrefstyle='select: title'/>
+to control mapping,
+a client may set <emphasis remap='I'>mapped_when_managed</emphasis> to
+<function>False</function>
+and use
+<xref linkend='XtMapWidget' xrefstyle='select: title'/>
+and
+<xref linkend='XtUnmapWidget' xrefstyle='select: title'/>
+explicitly.
+</para>
+
+<para>
+To map a widget explicitly, use
+<xref linkend='XtMapWidget' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtMapWidget'>
+<funcprototype>
+<funcdef> <function>XtMapWidget</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget.  Must be of class Core or any subclass thereof.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+To unmap a widget explicitly, use
+<xref linkend='XtUnmapWidget' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtUnmapWidget'>
+<funcprototype>
+<funcdef> <function>XtUnmapWidget</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget.  Must be of class Core or any subclass thereof.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+
+</sect1>
+
+<sect1 id="Constrained_Composite_Widgets">
+<title>Constrained Composite Widgets</title>
+<para>
+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>
+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>
+To make it easy for widgets and the Intrinsics 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>
+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>
+<literallayout >
+typedef struct {
+       Dimension max_width, max_height;
+} MaxConstraintPart;
+typedef struct {
+       MaxConstraintPart max;
+} MaxConstraintRecord, *MaxConstraint;
+</literallayout>
+<para>
+A subclass of this widget class that also needs to maintain a minimum size would
+define its constraint record as follows:
+</para>
+<literallayout >
+typedef struct {
+       Dimension min_width, min_height;
+} MinConstraintPart;
+typedef struct {
+       MaxConstraintPart max;
+       MinConstraintPart min;
+} MaxMinConstraintRecord, *MaxMinConstraint;
+</literallayout>
+<para>
+Constraints are allocated, initialized, deallocated, and otherwise maintained
+insofar as possible by the Intrinsics.
+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>
+The
+<xref linkend='XtCreateWidget' xrefstyle='select: title'/>
+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.
+<xref linkend='XtCreateWidget' xrefstyle='select: title'/>
+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>
+When the
+<xref linkend='XtGetValues' xrefstyle='select: title'/>
+and
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+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.
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+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
+<emphasis role='strong'>NULLQUARK</emphasis>
+and the <emphasis remap='I'>get_values_hook</emphasis> field in
+the extension record is non-NULL,
+<xref linkend='XtGetValues' xrefstyle='select: title'/>
+calls the get_values_hook
+procedure(s) to allow the parent to return derived constraint fields.
+</para>
+
+<para>
+The
+<xref linkend='XtDestroyWidget' xrefstyle='select: title'/>
+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;
+<xref linkend='XtDestroyWidget' xrefstyle='select: title'/>
+does this automatically.
+</para>
+</sect1>
+</chapter>
diff --git a/specs/CH04.xml b/specs/CH04.xml
new file mode 100644 (file)
index 0000000..d01fe6e
--- /dev/null
@@ -0,0 +1,2498 @@
+<chapter id='Shell_Widgets'>
+<title>Shell Widgets</title>
+
+<para>
+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>
+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>The five types of public shells are:</para>
+<variablelist>
+  <varlistentry>
+    <term>OverrideShell</term>
+    <listitem>
+      <para>
+      Used for shell windows that completely bypass the window manager
+      (for example, pop-up menu shells).
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>TransientShell</term>
+      <listitem>
+        <para>Used for shell windows that have the
+      <emphasis role='strong'>WM_TRANSIENT_FOR</emphasis>
+      property set. The effect of this property is dependent upon the
+      window manager being used.
+        </para>
+      </listitem>
+  </varlistentry>
+  <varlistentry>
+      <term>TopLevelShell</term>
+      <listitem>
+        <para>Used for normal top-level windows
+      (for example, any additional top-level widgets an application needs).
+        </para>
+      </listitem>
+  </varlistentry>
+  <varlistentry>
+      <term>ApplicationShell</term>
+      <listitem>
+        <para>Formerly used for the single main top-level window that
+      the window manager identifies as an application instance and
+      made obsolete by SessionShell.
+        </para>
+      </listitem>
+  </varlistentry>
+  <varlistentry>
+      <term>SessionShell</term>
+      <listitem>
+        <para>
+      Used for the single main top-level window that
+      the window manager identifies as an application instance and
+      that interacts with the session manager.
+        </para>
+      </listitem>
+  </varlistentry>
+</variablelist>
+
+<sect1 id="Shell_Widget_Definitions">
+<title>Shell Widget Definitions</title>
+<para>
+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>
+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>The eight different types of shells are:</para>
+<variablelist>
+  <varlistentry>
+    <term>Shell</term>
+    <listitem>
+      <para>The base class for shell widgets; provides the
+      fields needed for all types of shells.  Shell
+      is a direct subclass of
+      <emphasis role='strong'>compositeWidgetClass</emphasis>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>OverrideShell</term>
+    <listitem>
+      <para>A subclass of Shell; used for shell windows that completely
+      bypass the window manager.</para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>WMShell</term>
+    <listitem>
+      <para>A subclass of Shell; contains fields needed by the
+      common window manager protocol.</para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>VendorShell</term>
+    <listitem>
+      <para>A subclass of WMShell; contains fields used by
+      vendor-specific window managers.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>TransientShell</term>
+    <listitem>
+      <para>A subclass of VendorShell; used for shell windows that
+      desire the <emphasis role='strong'>WM_TRANSIENT_FOR</emphasis>
+      property.</para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>TopLevelShell</term>
+    <listitem>
+      <para>A subclass of VendorShell; used for normal top-level windows.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>ApplicationShell</term>
+      <listitem>
+      <para>A subclass of TopLevelShell; may be used for an application's additional
+      root windows.</para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>SessionShell</term>
+    <listitem>
+      <para>A subclass of ApplicationShell; used for an application's
+      main root window.</para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+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>
+
+<sect2 id="ShellClassPart_Definitions">
+<title>ShellClassPart Definitions</title>
+<para>
+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>
+
+<literallayout >
+typedef struct {
+        XtPointer extension;
+} ShellClassPart, OverrideShellClassPart,
+WMShellClassPart, VendorShellClassPart, TransientShellClassPart,
+TopLevelShellClassPart, ApplicationShellClassPart, SessionShellClassPart;
+</literallayout>
+
+<para>The full Shell class record definitions are:</para>
+
+<literallayout >
+typedef struct _ShellClassRec {
+       CoreClassPart   core_class;
+       CompositeClassPart      composite_class;
+       ShellClassPart  shell_class;
+} ShellClassRec;
+</literallayout>
+
+<literallayout >
+typedef struct {
+       XtPointer       next_extension; See <xref linkend='Class_Extension_Records' />
+       XrmQuark        record_type;    See <xref linkend='Class_Extension_Records' />
+       long    version;        See <xref linkend='Class_Extension_Records' />
+       Cardinal        record_size;    See <xref linkend='Class_Extension_Records' />
+       XtGeometryHandler       root_geometry_manager;  See below
+} ShellClassExtensionRec, *ShellClassExtension;
+</literallayout>
+
+<literallayout >
+typedef struct _OverrideShellClassRec {
+       CoreClassPart   core_class;
+       CompositeClassPart      composite_class;
+       ShellClassPart  shell_class;
+       OverrideShellClassPart  override_shell_class;
+} OverrideShellClassRec;
+</literallayout>
+
+<literallayout >
+typedef struct _WMShellClassRec {
+       CoreClassPart   core_class;
+       CompositeClassPart      composite_class;
+       ShellClassPart  shell_class;
+       WMShellClassPart        wm_shell_class;
+} WMShellClassRec;
+</literallayout>
+
+<literallayout >
+typedef struct _VendorShellClassRec {
+       CoreClassPart   core_class;
+       CompositeClassPart      composite_class;
+       ShellClassPart  shell_class;
+       WMShellClassPart        wm_shell_class;
+       VendorShellClassPart    vendor_shell_class;
+} VendorShellClassRec;
+</literallayout>
+
+<literallayout >
+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>
+
+<literallayout >
+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>
+
+<literallayout >
+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>
+
+<literallayout >
+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>
+The single occurrences of the class records and pointers for creating
+instances of shells are:
+</para>
+
+<literallayout >
+extern ShellClassRec shellClassRec;
+extern OverrideShellClassRec overrideShellClassRec;
+extern WMShellClassRec wmShellClassRec;
+extern VendorShellClassRec vendorShellClassRec;
+extern TransientShellClassRec transientShellClassRec;
+extern TopLevelShellClassRec topLevelShellClassRec;
+extern ApplicationShellClassRec applicationShellClassRec;
+extern SessionShellClassRec sessionShellClassRec;
+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>
+The following opaque types and opaque variables are defined
+for generic operations on widgets whose class is a subclass of
+Shell.
+</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Types</entry>
+      <entry>Variables</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry><emphasis role='strong'>ShellWidget</emphasis></entry>
+      <entry><emphasis role='strong'>shellWidgetClass</emphasis></entry>
+    </row>
+    <row>
+      <entry><emphasis role='strong'>OverrideShellWidget</emphasis></entry>
+      <entry><emphasis role='strong'>overrideShellWidgetClass</emphasis></entry>
+    </row>
+    <row>
+      <entry><emphasis role='strong'>WMShellWidget</emphasis></entry>
+      <entry><emphasis role='strong'>wmShellWidgetClass</emphasis></entry>
+    </row>
+    <row>
+      <entry><emphasis role='strong'>VendorShellWidget</emphasis></entry>
+      <entry><emphasis role='strong'>vendorShellWidgetClass</emphasis></entry>
+    </row>
+    <row>
+      <entry><emphasis role='strong'>TransientShellWidget</emphasis></entry>
+      <entry><emphasis role='strong'>transientShellWidgetClass</emphasis></entry>
+    </row>
+    <row>
+      <entry><emphasis role='strong'>TopLevelShellWidget</emphasis></entry>
+      <entry><emphasis role='strong'>topLevelShellWidgetClass</emphasis></entry>
+    </row>
+    <row>
+      <entry><emphasis role='strong'>ApplicationShellWidget</emphasis></entry>
+      <entry><emphasis role='strong'>applicationShellWidgetClass</emphasis></entry>
+    </row>
+    <row>
+      <entry><emphasis role='strong'>SessionShellWidget</emphasis></entry>
+      <entry><emphasis role='strong'>sessionShellWidgetClass</emphasis></entry>
+    </row>
+    <row>
+      <entry><emphasis role='strong'>ShellWidgetClass</emphasis></entry>
+      <entry></entry>
+    </row>
+    <row>
+      <entry><emphasis role='strong'>OverrideShellWidgetClass</emphasis></entry>
+      <entry></entry>
+    </row>
+    <row>
+      <entry><emphasis role='strong'>WMShellWidgetClass</emphasis></entry>
+      <entry></entry>
+    </row>
+    <row>
+      <entry><emphasis role='strong'>VendorShellWidgetClass</emphasis></entry>
+      <entry></entry>
+    </row>
+    <row>
+      <entry><emphasis role='strong'>TransientShellWidgetClass</emphasis></entry>
+      <entry></entry>
+    </row>
+    <row>
+      <entry><emphasis role='strong'>TopLevelShellWidgetClass</emphasis></entry>
+      <entry></entry>
+    </row>
+    <row>
+      <entry><emphasis role='strong'>ApplicationShellWidgetClass</emphasis></entry>
+      <entry></entry>
+    </row>
+    <row>
+      <entry><emphasis role='strong'>SessionShellWidgetClass</emphasis></entry>
+      <entry></entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+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>
+<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>
+The symbolic constant for the
+<function>ShellClassExtension</function>
+version identifier is
+<function>XtShellExtensionVersion</function>
+(see <xref linkend='Class_Extension_Records' />).
+</para>
+
+<para>
+The root_geometry_manager procedure acts as
+the parent geometry manager for geometry requests made by shell
+widgets.  When a shell widget calls either
+<xref linkend='XtMakeGeometryRequest' xrefstyle='select: title'/>
+or
+<xref linkend='XtMakeResizeRequest' xrefstyle='select: title'/>,
+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
+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>
+If no
+<function>ShellClassPart</function>
+extension record is declared with <emphasis remap='I'>record_type</emphasis>
+equal to
+<emphasis role='strong'>NULLQUARK</emphasis>,
+then
+<function>XtInheritRootGeometryManager</function>
+is assumed.
+</para>
+</sect2>
+
+<sect2 id="ShellPart_Definition">
+<title>ShellPart Definition</title>
+<para>
+The various shell widgets have the following additional instance
+fields defined in
+their widget records:
+</para>
+
+<literallayout >
+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>
+
+<literallayout >
+typedef struct {
+       int     empty;
+} OverrideShellPart;
+</literallayout>
+
+<literallayout >
+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>
+
+<literallayout >
+typedef struct {
+       int     vendor_specific;
+} VendorShellPart;
+</literallayout>
+
+<literallayout >
+typedef struct {
+       Widget  transient_for;
+} TransientShellPart;
+typedef struct {
+       String  icon_name;
+       Boolean iconic;
+       Atom    icon_name_encoding;
+} TopLevelShellPart;
+</literallayout>
+
+<literallayout >
+typedef struct {
+       char *  class;
+       XrmClass        xrm_class;
+       int     argc;
+       char ** argv;
+} ApplicationShellPart;
+</literallayout>
+
+<literallayout >
+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>
+The full shell widget instance record definitions are:
+</para>
+
+<literallayout >
+typedef struct {
+       CorePart        core;
+       CompositePart   composite;
+       ShellPart       shell;
+} ShellRec, *ShellWidget;
+</literallayout>
+
+<literallayout >
+typedef struct {
+       CorePart        core;
+       CompositePart   composite;
+       ShellPart       shell;
+       OverrideShellPart       override;
+} OverrideShellRec, *OverrideShellWidget;
+</literallayout>
+
+<literallayout >
+typedef struct {
+       CorePart        core;
+       CompositePart   composite;
+       ShellPart       shell;
+       WMShellPart     wm;
+} WMShellRec, *WMShellWidget;
+</literallayout>
+
+<literallayout >
+typedef struct {
+       CorePart        core;
+       CompositePart   composite;
+       ShellPart       shell;
+       WMShellPart     wm;
+       VendorShellPart vendor;
+} VendorShellRec, *VendorShellWidget;
+</literallayout>
+
+<literallayout >
+typedef struct {
+       CorePart        core;
+       CompositePart   composite;
+       ShellPart       shell;
+       WMShellPart     wm;
+       VendorShellPart vendor;
+       TransientShellPart      transient;
+} TransientShellRec, *TransientShellWidget;
+</literallayout>
+
+<literallayout >
+typedef struct {
+       CorePart        core;
+       CompositePart   composite;
+       ShellPart       shell;
+       WMShellPart     wm;
+       VendorShellPart vendor;
+       TopLevelShellPart       topLevel;
+} TopLevelShellRec, *TopLevelShellWidget;
+</literallayout>
+
+<literallayout >
+typedef  struct {
+       CorePart        core;
+       CompositePart   composite;
+       ShellPart       shell;
+       WMShellPart     wm;
+       VendorShellPart vendor;
+       TopLevelShellPart       topLevel;
+       ApplicationShellPart    application;
+} ApplicationShellRec, *ApplicationShellWidget;
+</literallayout>
+
+<literallayout >
+typedef  struct {
+       CorePart        core;
+       CompositePart   composite;
+       ShellPart       shell;
+       WMShellPart     wm;
+       VendorShellPart vendor;
+       TopLevelShellPart       topLevel;
+       ApplicationShellPart    application;
+       SessionShellPart        session;
+} SessionShellRec, *SessionShellWidget;
+</literallayout>
+
+</sect2>
+
+<sect2 id="Shell_Resources">
+<title>Shell Resources</title>
+<para>
+The resource names, classes, and representation types specified in
+the
+<function>shellClassRec</function>
+resource list are:
+</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='3' align='left' rowsep='0' colsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <colspec colwidth='1.0*' colname='c3'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Name</entry>
+      <entry>Class</entry>
+      <entry>Representation</entry>
+    </row>
+  </thead>
+  <tbody>
+    <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>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+OverrideShell
+declares no additional resources beyond those defined by
+Shell.
+</para>
+
+<para>
+The resource names, classes, and representation types specified in
+the
+<function>wmShellClassRec</function>
+resource list are:
+</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='3' align='left' rowsep='0' colsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <colspec colwidth='1.0*' colname='c3'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Name</entry>
+      <entry>Class</entry>
+      <entry>Representation</entry>
+    </row>
+  </thead>
+  <tbody>
+    <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>
+The class resource list for
+VendorShell
+is implementation-defined.
+</para>
+
+<para>
+The resource names, classes, and representation types that are specified in the
+<function>transient\%ShellClassRec</function>
+resource list are:
+</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <colspec colwidth='1.0*' colname='c3'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Name</entry>
+      <entry>Class</entry>
+      <entry>Representation</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>XtNtransientFor</entry>
+      <entry>XtCTransientFor</entry>
+      <entry>XtRWidget</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+The resource names, classes, and representation types that are specified in the
+<function>topLevelShellClassRec</function>
+resource list are:
+</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <colspec colwidth='1.0*' colname='c3'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Name</entry>
+      <entry>Class</entry>
+      <entry>Representation</entry>
+    </row>
+  </thead>
+  <tbody>
+    <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>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+The resource names, classes, and representation types that are specified in the
+<function>application\%ShellClassRec</function>
+resource list are:
+</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <colspec colwidth='1.0*' colname='c3'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Name</entry>
+      <entry>Class</entry>
+      <entry>Representation</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>XtNargc</entry>
+      <entry>XtCArgc</entry>
+      <entry>XtRInt</entry>
+    </row>
+    <row>
+      <entry>XtNargv</entry>
+      <entry>XtCArgv</entry>
+      <entry>XtRStringArray</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+The resource names, classes, and representation types that are specified
+in the
+<function>sessionShellClassRec</function>
+resource list are:
+</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <colspec colwidth='1.0*' colname='c3'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Name</entry>
+      <entry>Class</entry>
+      <entry>Representation</entry>
+    </row>
+  </thead>
+  <tbody>
+    <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>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+</sect2>
+
+<sect2 id="ShellPart_Default_Values">
+<title>ShellPart Default Values</title>
+<para>
+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:
+</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Field</entry>
+      <entry>Default Value</entry>
+    </row>
+  </thead>
+  <tbody>
+    <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><function>False</function></entry>
+    </row>
+    <row>
+      <entry>allow_shell_resize</entry>
+      <entry><function>False</function></entry>
+    </row>
+    <row>
+      <entry>client_specified</entry>
+      <entry>(internal)</entry>
+    </row>
+    <row>
+      <entry>save_under</entry>
+      <entry><function>True</function>
+      for OverrideShell and TransientShell,
+      <emphasis role='strong'>False</emphasis>
+      otherwise</entry>
+    </row>
+    <row>
+      <entry>override_redirect</entry>
+      <entry><function>True</function>
+      for OverrideShell,
+      <function>False</function>
+      otherwise</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><function>CopyFromParent</function></entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+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 Intrinsics
+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
+<olink targetdoc='libX11' targetptr='Parsing_the_Window_Geometry' />
+in <olink targetdoc='libX11' targetptr='libX11'>Xlib â€” C Language X Interface</olink>.
+</para>
+
+<para>
+The <emphasis remap='I'>create_popup_child_proc</emphasis> procedure is called by the
+<xref linkend='XtPopup' xrefstyle='select: title'/>
+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
+<xref linkend='XtPopup' xrefstyle='select: title'/>,
+<xref linkend='XtMenuPopup' xrefstyle='select: title'/>,
+<xref linkend='XtPopdown' xrefstyle='select: title'/>,
+and
+<xref linkend='XtMenuPopdown' xrefstyle='select: title'/>.
+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 <olink targetdoc='libX11' targetptr='Window_Attributes' /> in
+<olink targetdoc='libX11' targetptr='libX11'>Xlib â€” C Language X Interface</olink>
+and
+<olink targetdoc='icccm' targetptr='Pop_up_Windows' /> and
+<olink targetdoc='icccm' targetptr='Redirection_of_Operations' /> in the
+<olink targetdoc='icccm' targetptr='icccm'>Inter-Client Communication Conventions Manual</olink>.
+The pop-up and pop-down callbacks are called during
+<xref linkend='XtPopup' xrefstyle='select: title'/>
+and
+<xref linkend='XtPopdown' xrefstyle='select: title'/>.
+The default value of the <emphasis remap='I'>visual</emphasis> resource is the symbolic value
+<function>CopyFromParent</function>.
+The Intrinsics do not need to query the parent's visual type when the
+default value is used; if a client using
+<xref linkend='XtGetValues' xrefstyle='select: title'/>
+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>
+The default values for Shell fields in
+WMShell
+and its subclasses are:
+</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Field</entry>
+      <entry>Default Value</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>title</entry>
+      <entry>Icon name, if specified, otherwise the application's name</entry>
+    </row>
+    <row>
+      <entry>wm_timeout</entry>
+      <entry>Five seconds, in units of milliseconds</entry>
+    </row>
+    <row>
+      <entry>wait_for_wm</entry>
+      <entry><function>True</function></entry>
+    </row>
+    <row>
+      <entry>transient</entry>
+      <entry><function>True</function>
+      for TransientShell,
+      <function>False</function>
+      otherwise</entry>
+    </row>
+    <row>
+      <entry>urgency</entry>
+      <entry><function>False</function></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><function>False</function></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>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+The <emphasis remap='I'>title</emphasis> and
+<emphasis remap='I'>title_encoding</emphasis> fields are stored in the
+<emphasis role='strong'>WM_NAME</emphasis>
+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
+<emphasis role='strong'>WM_NAME</emphasis>
+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
+<emphasis role='strong'>XA_STRING</emphasis>, 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
+<emphasis role='strong'>WM_TRANSIENT_FOR</emphasis>
+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
+<olink targetdoc='icccm' targetptr='icccm'>Inter-Client Communication Conventions Manual</olink>
+for more details.
+</para>
+
+<para>
+The realize and set_values procedures of WMShell store the
+<emphasis role='strong'>WM_CLIENT_LEADER</emphasis>
+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>
+When the value of <emphasis remap='I'>window_role</emphasis> is not NULL, the
+realize and set_values procedures store the
+<emphasis role='strong'>WM_WINDOW_ROLE</emphasis>
+property on the shell's window with the value of the resource.
+</para>
+
+<para>
+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:
+</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Field</entry>
+      <entry>Replacement</entry>
+    </row>
+  </thead>
+  <tbody>
+    <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>Value returned by
+      <function>XWMGeometry</function>
+      if called,
+      else <function>NorthWestGravity</function></entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+If the shell widget has a non-NULL parent, then the
+realize and set_values procedures replace the value
+<function>XtUnspecifiedWindow</function>
+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>
+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
+<emphasis role='strong'>WM_TRANSIENT_FOR</emphasis>
+property with the value of <emphasis remap='I'>window_group</emphasis>.
+</para>
+
+<para>
+Transient
+shells have the following additional resource:
+</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Field</entry>
+      <entry>Replacement</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>transient_for</entry>
+      <entry>NULL</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+The realize and set_values procedures of
+TransientShell
+store the
+<emphasis role='strong'>WM_TRANSIENT_FOR</emphasis>
+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
+<emphasis role='strong'>WM_TRANSIENT_FOR</emphasis>
+property; otherwise, the value of <emphasis remap='I'>window_group</emphasis> is used.
+</para>
+
+<para>
+<function>TopLevel</function>
+shells have the the following additional resources:
+</para>
+
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Field</entry>
+      <entry>Default Value</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>icon_name</entry>
+      <entry>Shell widget's name</entry>
+    </row>
+    <row>
+      <entry>iconic</entry>
+      <entry><emphasis role='strong'>False</emphasis></entry>
+    </row>
+    <row>
+      <entry>icon_name_encoding</entry>
+      <entry>See text</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+The <emphasis remap='I'>icon_name</emphasis>
+and <emphasis remap='I'>icon_name_encoding</emphasis> fields are stored in the
+<emphasis role='strong'>WM_ICON_NAME</emphasis>
+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
+<emphasis role='strong'>WM_ICON_NAME</emphasis>
+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
+<emphasis role='strong'>XA_STRING</emphasis>, 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
+<emphasis role='strong'>WM_CHANGE_STATE</emphasis>
+message (as specified by the <emphasis remap='I'>Inter-Client Communication Conventions Manual</emphasis>)
+if this resource is changed from
+<function>False</function>
+to
+<function>True</function>
+and will call
+<xref linkend='XtPopup' xrefstyle='select: title'/>
+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>
+Application
+shells have the following additional resources:
+</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Field</entry>
+      <entry>Default Value</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>argc</entry>
+      <entry>0</entry>
+    </row>
+    <row>
+      <entry>argv</entry>
+      <entry>NULL</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+The <emphasis remap='I'>argc</emphasis> and <emphasis remap='I'>argv</emphasis> fields are used to initialize
+the standard property
+<emphasis role='strong'>WM_COMMAND</emphasis>.  See the
+<olink targetdoc='icccm' targetptr='icccm'>Inter-Client Communication Conventions Manual</olink>
+for more information.
+</para>
+
+<para>
+The default values for the SessionShell instance fields,
+which are filled in from the resource lists and by the
+initialize procedure, are
+</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Field</entry>
+      <entry>Default Value</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>cancel_callbacks</entry>
+      <entry>NULL</entry>
+    </row>
+    <row>
+      <entry>clone_command</entry>
+      <entry>See text</entry>
+    </row>
+    <row>
+      <entry>connection</entry>
+      <entry>NULL</entry>
+    </row>
+    <row>
+      <entry>current_dir</entry>
+      <entry>NULL</entry>
+    </row>
+    <row>
+      <entry>die_callbacks</entry>
+      <entry>NULL</entry>
+    </row>
+    <row>
+      <entry>discard_command</entry>
+      <entry>NULL</entry>
+    </row>
+    <row>
+      <entry>environment</entry>
+      <entry>NULL</entry>
+    </row>
+    <row>
+      <entry>error_callbacks</entry>
+      <entry>NULL</entry>
+    </row>
+    <row>
+      <entry>interact_callbacks</entry>
+      <entry>NULL</entry>
+    </row>
+    <row>
+      <entry>join_session</entry>
+      <entry><emphasis role='strong'>True</emphasis></entry>
+    </row>
+    <row>
+      <entry>program_path</entry>
+      <entry>NULL</entry>
+    </row>
+    <row>
+      <entry>resign_command</entry>
+      <entry>NULL</entry>
+    </row>
+    <row>
+      <entry>restart_command</entry>
+      <entry>See text</entry>
+    </row>
+    <row>
+      <entry>restart_style</entry>
+      <entry><emphasis role='strong'>SmRestartIfRunning</emphasis></entry>
+    </row>
+    <row>
+      <entry>save_callbacks</entry>
+      <entry>NULL</entry>
+    </row>
+    <row>
+      <entry>save_complete_callbacks</entry>
+      <entry>NULL</entry>
+    </row>
+    <row>
+      <entry>session_id</entry>
+      <entry>NULL</entry>
+    </row>
+    <row>
+      <entry>shutdown_command</entry>
+      <entry>NULL</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+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>
+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
+<emphasis role='strong'>SM_CLIENT_ID</emphasis>
+property on the client leader's window.
+</para>
+
+<para>
+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 <xref linkend='Joining_a_Session' /> and
+<xref linkend='Resigning_from_a_Session' />
+for more information on the functionality of this resource.
+</para>
+
+<para>
+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>
+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 "<emphasis>-xtsessionID</emphasis>" "<emphasis>&lt;session id&gt;</emphasis>" 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 "<emphasis>-xtsessionID</emphasis>" argument already appears with an incorrect
+<emphasis>session id</emphasis> in the following argument, that argument
+will be replaced with the current <emphasis>session id</emphasis>.
+</para>
+
+<para>
+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 "<emphasis>-xtsessionID</emphasis>" and following argument will not be copied.
+</para>
+
+<para>
+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>
+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 <xref linkend='Predefined_Resource_Converters' />.
+</para>
+
+<para>
+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>
+</sect2>
+</sect1>
+
+<sect1 id="Session_Participation">
+<title>Session Participation</title>
+<para>
+Applications can participate in a user's session, exchanging messages
+with the session manager as described in the
+<emphasis>X Session Management Protocol</emphasis> and the
+<emphasis remap='I'>X Session Management Library</emphasis>.
+</para>
+
+<para>
+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>
+
+<sect2 id="Joining_a_Session">
+<title>Joining a Session</title>
+<para>
+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
+<emphasis role='strong'>SESSION_MANAGER</emphasis>
+environment variable is defined,
+the shell will attempt to establish a new connection with the session manager.
+</para>
+
+<para>
+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>
+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
+<emphasis role='strong'>SESSION_MANAGER</emphasis>
+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>
+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
+<xref linkend='XtAppAddInput' xrefstyle='select: title'/>
+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>
+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>
+</sect2>
+
+<sect2 id="Saving_Application_State">
+<title>Saving Application State</title>
+<para>
+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>
+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.
+</para>
+
+<para>
+The checkpoint token in the <emphasis remap='I'>call_data</emphasis> parameter is of type
+<function>XtCheckpointToken</function>.
+</para>
+
+<literallayout >
+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>
+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 <xref linkend='Resigning_from_a_Session' />.)
+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>
+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>
+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>
+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>
+The application may request additional tokens while a checkpoint is under way,
+and these additional tokens must be returned by an explicit call.
+</para>
+
+<para>
+To request an additional token for a save callback response that has a
+deferred outcome, use
+<xref linkend='XtSessionGetToken' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtSessionGetToken'>
+<funcprototype>
+<funcdef>XtCheckpointToken <function>XtSessionGetToken</function></funcdef>
+   <paramdef>Widget <parameter>widget</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtSessionGetToken' xrefstyle='select: title'/>
+function will return NULL if no checkpoint operation is currently under way.
+</para>
+
+<para>
+To indicate the completion of checkpoint processing including user
+interaction, the application must signal the Session shell
+by returning all tokens.
+(See <xref linkend='Interacting_with_the_User_during_a_Checkpoint' /> and 
+<xref linkend='Completing_a_Save' />).
+To return a token, use
+<xref linkend='XtSessionReturnToken' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtSessionReturnToken'>
+<funcprototype>
+<funcdef>void <function>XtSessionReturnToken</function></funcdef>
+   <paramdef>XtCheckpointToken <parameter>token</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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
+<xref linkend='XtSessionGetToken' xrefstyle='select: title'/>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+
+<para>
+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
+<xref linkend='XtSessionReturnToken' xrefstyle='select: title'/>
+on the token passed in its <emphasis remap='I'>call_data</emphasis>.
+</para>
+
+<sect3 id="Requesting_Interaction">
+<title>Requesting Interaction</title>
+<para>
+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
+<xref linkend='XtSessionGetToken' xrefstyle='select: title'/>
+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>
+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>
+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>
+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
+<xref linkend='XtSessionGetToken' xrefstyle='select: title'/>.
+</para>
+</sect3>
+
+<sect3 id="Interacting_with_the_User_during_a_Checkpoint">
+<title>Interacting with the User during a Checkpoint</title>
+<para>
+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
+<xref linkend='XtSessionReturnToken' xrefstyle='select: title'/>.
+Returning the token completes the current step and triggers the next step
+in the sequence.
+</para>
+
+<para>
+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>
+</sect3>
+
+<sect3 id="Responding_to_a_Shutdown_Cancellation">
+<title>Responding to a Shutdown Cancellation</title>
+<para>
+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>
+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>
+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>
+</sect3>
+
+<sect3 id="Completing_a_Save">
+<title>Completing a Save</title>
+<para>
+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
+<xref linkend='XtSessionGetToken' xrefstyle='select: title'/>
+have been returned by corresponding calls to
+<xref linkend='XtSessionReturnToken' xrefstyle='select: title'/>.
+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
+<xref linkend='XtSessionReturnToken' xrefstyle='select: title'/>.
+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.
+</para>
+
+<para>
+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>
+</sect3>
+</sect2>
+
+<sect2 id="Responding_to_a_Shutdown">
+<title>Responding to a Shutdown</title>
+<para>
+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>
+</sect2>
+
+<sect2 id="Resigning_from_a_Session">
+<title>Resigning from a Session</title>
+<para>
+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>
+When
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+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>
+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>
+When
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+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>
+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>
+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.
+</para>
+</sect2>
+</sect1>
+</chapter>
diff --git a/specs/CH05.xml b/specs/CH05.xml
new file mode 100644 (file)
index 0000000..2c09455
--- /dev/null
@@ -0,0 +1,1063 @@
+<chapter id='Pop_Up_Widgets'>
+<title>Pop-Up Widgets</title>
+<para>
+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.
+Therefore, pop-ups are created and attached differently to their widget parent
+than normal widget children.
+</para>
+
+<para>
+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
+<xref linkend='XtDestroyWidget' xrefstyle='select: title'/>
+to look for all extant children.
+</para>
+
+<para>
+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.
+</para>
+
+<sect1 id="Pop_Up_Widget_Types">
+<title>Pop-Up Widget Types</title>
+<para>
+There are three kinds of pop-up widgets:
+</para>
+
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+Modeless pop-ups
+    </para>
+    <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>
+    <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>
+    <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>
+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 Intrinsics.
+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>
+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>
+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>
+</sect1>
+
+<sect1 id="Creating_a_Pop_Up_Shell">
+<title>Creating a Pop-Up Shell</title>
+<para>
+For a widget to be popped up,
+it must be the child of a pop-up shell widget.
+None of the Intrinsics-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.
+</para>
+
+<para>
+To create a pop-up shell, use
+<xref linkend='XtCreatePopupShell' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtCreatePopupShell'>
+<funcprototype>
+<funcdef>Widget <function>XtCreatePopupShell</function></funcdef>
+   <paramdef>String <parameter>name</parameter></paramdef>
+   <paramdef>WidgetClass <parameter>widget_class</parameter></paramdef>
+   <paramdef>Widget <parameter>parent</parameter></paramdef>
+   <paramdef>ArgList <parameter>args</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_args</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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.  Must be of class Core 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>
+The
+<xref linkend='XtCreatePopupShell' xrefstyle='select: title'/>
+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
+<emphasis remap='I'>children</emphasis> list,
+attaches the shell to the parent's <emphasis remap='I'>popup_list</emphasis> directly.
+</para>
+
+<para>
+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>
+A spring-loaded pop-up invoked from a translation table via
+<xref linkend='XtMenuPopup' xrefstyle='select: title'/>
+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.
+</para>
+
+<para>
+To create a pop-up shell using varargs lists, use
+<xref linkend='XtVaCreatePopupShell' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtVaCreatePopupShell'>
+<funcprototype>
+<funcdef>Widget <function>XtVaCreatePopupShell</function></funcdef>
+   <paramdef>String <parameter>name</parameter></paramdef>
+   <paramdef>WidgetClass <parameter>widget_class</parameter></paramdef>
+   <paramdef>Widget <parameter>parent</parameter></paramdef>
+   <paramdef><parameter>...</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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.  Must be of class Core 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>
+<xref linkend='XtVaCreatePopupShell' xrefstyle='select: title'/>
+is identical in function to
+<xref linkend='XtCreatePopupShell' xrefstyle='select: title'/>
+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>
+</sect1>
+
+<sect1 id="Creating_Pop_Up_Children">
+<title>Creating Pop-Up Children</title>
+<para>
+Once a pop-up shell is created,
+the single child of the pop-up shell can be created
+either statically or dynamically.
+</para>
+
+<para>
+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
+<xref linkend='XtSetSensitive' xrefstyle='select: title'/>
+(or, in general,
+<xref linkend='XtSetValues' xrefstyle='select: title'/>)
+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
+<xref linkend='XtRealizeWidget' xrefstyle='select: title'/>
+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>
+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>
+Pop-up child creation does not map the pop-up,
+even if you create the child and call
+<xref linkend='XtRealizeWidget' xrefstyle='select: title'/>
+on the pop-up shell.
+</para>
+
+<para>
+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>
+</sect1>
+
+<sect1 id="Mapping_a_Pop_Up_Widget">
+<title>Mapping a Pop-Up Widget</title>
+<para>
+Pop-ups can be popped up through several mechanisms:
+</para>
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+A call to
+<xref linkend='XtPopup' xrefstyle='select: title'/>
+or
+<xref linkend='XtPopupSpringLoaded' xrefstyle='select: title'/>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+One of the supplied callback procedures
+<xref linkend='XtCallbackNone' xrefstyle='select: title'/>,
+<xref linkend='XtCallbackNonexclusive' xrefstyle='select: title'/>,
+or
+<xref linkend='XtCallbackExclusive' xrefstyle='select: title'/>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The standard translation action
+<xref linkend='XtMenuPopup' xrefstyle='select: title'/>.
+    </para>
+  </listitem>
+</itemizedlist>
+
+<para>
+Some of these routines take an argument of type
+<function>XtGrabKind</function>,
+which is defined as
+</para>
+<literallayout >
+typedef enum {XtGrabNone, XtGrabNonexclusive, XtGrabExclusive} XtGrabKind;
+</literallayout>
+
+<para>
+The create_popup_child_proc procedure pointer
+in the shell widget instance record is of type
+<xref linkend='XtCreatePopupChildProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtCreatePopupChildProc'>
+<funcprototype>
+<funcdef>void <function>*XtCreatePopupChildProc</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the shell widget being popped up.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+
+<para>
+To map a pop-up from within an application, use
+<xref linkend='XtPopup' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtPopup'>
+<funcprototype>
+<funcdef>void <function>XtPopup</function></funcdef>
+   <paramdef>Widget <parameter>popup_shell</parameter></paramdef>
+   <paramdef>XtGrabKind <parameter>grab_kind</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtPopup' xrefstyle='select: title'/>
+function performs the following:
+</para>
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+Calls
+<xref linkend='XtCheckSubclass' xrefstyle='select: title'/>
+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,
+<xref linkend='XtPopup' xrefstyle='select: title'/>
+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>
+<literallayout >
+XtAddGrab(<emphasis remap='I'>popup_shell</emphasis>, (<emphasis remap='I'>grab_kind</emphasis> == XtGrabExclusive), False)
+</literallayout>
+  </listitem>
+  <listitem>
+    <para>
+Calls
+<xref linkend='XtRealizeWidget' xrefstyle='select: title'/>
+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>.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+To map a spring-loaded pop-up from within an application, use
+<xref linkend='XtPopupSpringLoaded' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtPopupSpringLoaded'>
+<funcprototype>
+<funcdef>void <function>XtPopupSpringLoaded</function></funcdef>
+   <paramdef>Widget <parameter>popup_shell</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtPopupSpringLoaded' xrefstyle='select: title'/>
+function performs exactly as
+<xref linkend='XtPopup' xrefstyle='select: title'/>
+except that it sets the shell <emphasis remap='I'>spring_loaded</emphasis> field to
+<function>True</function>
+and always calls
+<xref linkend='XtAddGrab' xrefstyle='select: title'/>
+with <emphasis remap='I'>exclusive</emphasis>
+<function>True</function>
+and <emphasis remap='I'>spring-loaded</emphasis>
+<function>True</function>.
+</para>
+
+<para>
+To map a pop-up from a given widget's callback list,
+you also can register one of the
+<xref linkend='XtCallbackNone' xrefstyle='select: title'/>,
+<xref linkend='XtCallbackNonexclusive' xrefstyle='select: title'/>,
+or
+<xref linkend='XtCallbackExclusive' xrefstyle='select: title'/>
+convenience routines as callbacks, using the pop-up shell widget as the
+client data.
+</para>
+
+<funcsynopsis id='XtCallbackNone'>
+<funcprototype>
+<funcdef>void <function>XtCallbackNone</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+   <paramdef>XtPointer <parameter>call_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+
+
+<funcsynopsis id='XtCallbackNonexclusive'>
+<funcprototype>
+<funcdef>void <function>XtCallbackNonexclusive</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+   <paramdef>XtPointer <parameter>call_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+
+
+<funcsynopsis id='XtCallbackExclusive'>
+<funcprototype>
+<funcdef>void <function>XtCallbackExclusive</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+   <paramdef>XtPointer <parameter>call_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtCallbackNone' xrefstyle='select: title'/>,
+<xref linkend='XtCallbackNonexclusive' xrefstyle='select: title'/>,
+and
+<xref linkend='XtCallbackExclusive' xrefstyle='select: title'/>
+functions call
+<xref linkend='XtPopup' xrefstyle='select: title'/>
+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.
+<xref linkend='XtCallbackNone' xrefstyle='select: title'/>,
+<xref linkend='XtCallbackNonexclusive' xrefstyle='select: title'/>,
+and
+<xref linkend='XtCallbackExclusive' xrefstyle='select: title'/>
+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
+<xref linkend='XtSetSensitive' xrefstyle='select: title'/>.
+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.
+</para>
+
+<para>
+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
+<xref linkend='XtMenuPopup' xrefstyle='select: title'/>,
+or its synonym,
+<function>MenuPopup</function>.
+From a translation writer's point of view,
+the definition for this translation action is
+</para>
+
+<funcsynopsis id='XtMenuPopup'>
+<funcprototype>
+<funcdef>void <function>XtMenuPopup</function></funcdef>
+   <paramdef>String <parameter>shell_name</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+<xref linkend='XtMenuPopup' xrefstyle='select: title'/>
+is known to the translation manager,
+which registers the corresponding built-in action procedure
+<function>XtMenuPopupAction</function>
+using
+<xref linkend='XtRegisterGrabAction' xrefstyle='select: title'/>
+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>
+If
+<xref linkend='XtMenuPopup' xrefstyle='select: title'/>
+is invoked on
+<function>ButtonPress</function>,
+it calls
+<xref linkend='XtPopupSpringLoaded' xrefstyle='select: title'/>
+on the specified shell widget.
+If
+<xref linkend='XtMenuPopup' xrefstyle='select: title'/>
+is invoked on
+<function>KeyPress</function>
+or
+<function>EnterWindow</function>,
+it calls
+<xref linkend='XtPopup' xrefstyle='select: title'/>
+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>
+<xref linkend='XtMenuPopup' xrefstyle='select: title'/>
+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
+<xref linkend='XtMenuPopup' xrefstyle='select: title'/>
+gets to the application top-level shell widget and has not
+found a matching shell, it generates a warning and returns immediately.
+</para>
+</sect1>
+
+<sect1 id="Unmapping_a_Pop_Up_Widget">
+<title>Unmapping a Pop-Up Widget</title>
+<para>
+Pop-ups can be popped down through several mechanisms:
+</para>
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+A call to
+<xref linkend='XtPopdown' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The supplied callback procedure
+<xref linkend='XtCallbackPopdown' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The standard translation action
+<xref linkend='XtMenuPopdown' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+To unmap a pop-up from within an application, use
+<xref linkend='XtPopdown' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtPopdown'>
+<funcprototype>
+<funcdef>void <function>XtPopdown</function></funcdef>
+   <paramdef>Widget <parameter>popup_shell</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>popup_shell</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the shell widget to pop down.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtPopdown' xrefstyle='select: title'/>
+function performs the following:
+</para>
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+Calls
+<xref linkend='XtCheckSubclass' xrefstyle='select: title'/>
+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'>Inter-Client Communication Conventions Manual</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
+<xref linkend='XtRemoveGrab' xrefstyle='select: title'/>.
+    </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.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+To pop down a pop-up from a callback list, you may use the callback
+<xref linkend='XtCallbackPopdown' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtCallbackPopdown'>
+<funcprototype>
+<funcdef>void <function>XtCallbackPopdown</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+   <paramdef>XtPointer <parameter>call_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtCallbackPopdown' xrefstyle='select: title'/>
+function casts the <emphasis remap='I'>client_data</emphasis> parameter to a pointer of type
+<function>XtPopdownID</function>.
+</para>
+<literallayout >
+typedef struct {
+       Widget shell_widget;
+       Widget enable_widget;
+} XtPopdownIDRec, *XtPopdownID;
+</literallayout>
+<para>
+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>
+<xref linkend='XtCallbackPopdown' xrefstyle='select: title'/>
+calls
+<xref linkend='XtPopdown' xrefstyle='select: title'/>
+with the specified <emphasis remap='I'>shell_widget</emphasis>
+and then calls
+<xref linkend='XtSetSensitive' xrefstyle='select: title'/>
+to resensitize <emphasis remap='I'>enable_widget</emphasis>.
+</para>
+
+<para>
+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
+<xref linkend='XtMenuPopdown' xrefstyle='select: title'/>
+or its synonym,
+<function>MenuPopdown</function>.
+From a translation writer's point of view,
+the definition for this translation action is
+</para>
+
+<funcsynopsis id='XtMenuPopdown'>
+<funcprototype>
+<funcdef>void <function>XtMenuPopdown</function></funcdef>
+   <paramdef>String <parameter>shell_name</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+If a shell name is not given,
+<xref linkend='XtMenuPopdown' xrefstyle='select: title'/>
+calls
+<xref linkend='XtPopdown' xrefstyle='select: title'/>
+with the widget for which the translation is specified.
+If <emphasis remap='I'>shell_name</emphasis> is specified in the translation table,
+<xref linkend='XtMenuPopdown' xrefstyle='select: title'/>
+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
+<xref linkend='XtMenuPopdown' xrefstyle='select: title'/>
+gets to the application top-level shell widget
+and cannot find a matching shell,
+it generates a warning and returns immediately.
+</para>
+</sect1>
+</chapter>
diff --git a/specs/CH06.xml b/specs/CH06.xml
new file mode 100644 (file)
index 0000000..7ff51bf
--- /dev/null
@@ -0,0 +1,1369 @@
+<chapter id='Geometry_Management'>
+<title>Geometry Management</title>
+
+<para>
+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>
+To resolve physical layout conflicts between sibling widgets and between
+a widget and its parent, the Intrinsics 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>
+
+<sect1 id="Initiating_Geometry_Changes">
+<title>Initiating Geometry Changes</title>
+
+<para>
+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>,
+<xref linkend='XtResizeWidget' xrefstyle='select: title'/>,
+or
+<xref linkend='XtConfigureWidget' xrefstyle='select: title'/>.
+A child must ask its parent for a geometry change by calling
+<xref linkend='XtMakeGeometryRequest' xrefstyle='select: title'/>
+or
+<xref linkend='XtMakeResizeRequest' xrefstyle='select: title'/>.
+An application or other client code initiates a geometry change by calling
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+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>
+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>
+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
+<xref linkend='XtMoveWidget' xrefstyle='select: title'/>.
+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
+<xref linkend='XtResizeWidget' xrefstyle='select: title'/>.
+The requesting child may be given special treatment; see
+<xref linkend='Child_Geometry_Management_The_geometry_manager_Procedure' />.
+It can simultaneously move and resize a child with a single call to
+<xref linkend='XtConfigureWidget' xrefstyle='select: title'/>.
+</para>
+
+<para>
+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>
+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 <xref linkend='Creating_Widgets' /> and
+<xref linkend='Realizing_Widgets' />.
+</para>
+
+<note>
+<orderedlist>
+  <listitem>
+    <para>
+The Intrinsics 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
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+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.
+    </para>
+  </listitem>
+</orderedlist>
+</note>
+</sect1>
+
+<sect1 id="General_Geometry_Manager_Requests">
+<title>General Geometry Manager Requests</title>
+<para>
+When making a geometry request, the child specifies an
+<function>XtWidgetGeometry</function>
+structure.
+</para>
+
+<literallayout >
+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>
+
+<para>
+To make a general geometry manager request from a widget, use
+<xref linkend='XtMakeGeometryRequest' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtMakeGeometryRequest'>
+<funcprototype>
+<funcdef>XtGeometryResult <function>XtMakeGeometryRequest</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>XtWidgetGeometry *<parameter>request</parameter></paramdef>
+   <paramdef>XtWidgetGeometry *<parameter>reply_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget making the request.  Must be of class RectObj or any subclass thereof.
+      </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>
+Depending on the condition,
+<xref linkend='XtMakeGeometryRequest' xrefstyle='select: title'/>
+performs the following:
+</para>
+
+<itemizedlist spacing='compact'>
+  <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-&gt;request_mode</emphasis>
+and if the widget is realized,
+<xref linkend='XtMakeGeometryRequest' xrefstyle='select: title'/>
+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,
+<xref linkend='XtMakeGeometryRequest' xrefstyle='select: title'/>
+does no configuring and returns
+<function>XtGeometryYes</function>.
+<xref linkend='XtMakeGeometryRequest' xrefstyle='select: title'/>
+never returns
+<function>XtGeometryDone</function>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Otherwise,
+<xref linkend='XtMakeGeometryRequest' xrefstyle='select: title'/>
+just returns the resulting value from the parent's geometry manager.
+    </para>
+  </listitem>
+</itemizedlist>
+
+<para>
+Children of primitive widgets are always unmanaged; therefore,
+<xref linkend='XtMakeGeometryRequest' xrefstyle='select: title'/>
+always returns
+<function>XtGeometryYes</function>
+when called by a child of a primitive widget.
+</para>
+
+<para>
+The return codes from geometry managers are
+</para>
+
+<literallayout >
+typedef enum {
+       XtGeometryYes,
+       XtGeometryNo,
+       XtGeometryAlmost,
+       XtGeometryDone
+} XtGeometryResult;
+</literallayout>
+
+<para>
+The <emphasis remap='I'>request_mode</emphasis> definitions are from
+<function>&lt;X11/X.h&gt;</function>.
+</para>
+
+<informaltable frame='none'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <colspec colwidth='1.0*' colname='c3'/>
+  <tbody>
+    <row>
+      <entry>#define</entry>
+      <entry><function>CWX</function></entry>
+      <entry>(1&lt;&lt;0)</entry>
+    </row>
+    <row>
+      <entry>#define</entry>
+      <entry><function>CWY</function></entry>
+      <entry>(1&lt;&lt;1)</entry>
+    </row>
+    <row>
+      <entry>#define</entry>
+      <entry><function>CWWidth</function></entry>
+      <entry>(1&lt;&lt;2)</entry>
+    </row>
+    <row>
+      <entry>#define</entry>
+      <entry><function>CWHeight</function></entry>
+      <entry>(1&lt;&lt;3)</entry>
+    </row>
+    <row>
+      <entry>#define</entry>
+      <entry><function>CWBorderWidth</function></entry>
+      <entry>(1&lt;&lt;4)</entry>
+    </row>
+    <row>
+      <entry>#define</entry>
+      <entry><function>CWSibling</function></entry>
+      <entry>(1&lt;&lt;5)</entry>
+    </row>
+    <row>
+      <entry>#define</entry>
+      <entry><function>CWStackMode</function></entry>
+      <entry>(1&lt;&lt;6)</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+The Intrinsics also support the following value.
+</para>
+
+<informaltable frame='none'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <colspec colwidth='1.0*' colname='c3'/>
+  <tbody>
+    <row>
+      <entry>#define</entry>
+      <entry><function>XtCWQueryOnly</function></entry>
+      <entry>(1&lt;&lt;7)</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+<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>
+<xref linkend='XtMakeGeometryRequest' xrefstyle='select: title'/>,
+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>
+The <emphasis remap='I'>stack_mode</emphasis> definitions are from
+<function>&lt;X11/X.h&gt;</function>:
+</para>
+
+<informaltable frame='none'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <colspec colwidth='1.0*' colname='c3'/>
+  <tbody>
+    <row>
+      <entry>#define</entry>
+      <entry><function>Above</function></entry>
+      <entry>0</entry>
+    </row>
+    <row>
+      <entry>#define</entry>
+      <entry><function>Below</function></entry>
+      <entry>1</entry>
+    </row>
+    <row>
+      <entry>#define</entry>
+      <entry><function>TopIf</function></entry>
+      <entry>2</entry>
+    </row>
+    <row>
+      <entry>#define</entry>
+      <entry><function>BottomIf</function></entry>
+      <entry>3</entry>
+    </row>
+    <row>
+      <entry>#define</entry>
+      <entry><function>Opposite</function></entry>
+      <entry>4</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+The Intrinsics also support the following value.
+</para>
+
+<informaltable frame='none'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <colspec colwidth='1.0*' colname='c3'/>
+  <tbody>
+    <row>
+      <entry>#define</entry>
+      <entry><function>XtSMDontChange</function></entry>
+      <entry>5</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+For definition and behavior of
+<function>Above</function>,
+<function>Below</function>,
+<function>TopIf</function>,
+<function>BottomIf</function>,
+and
+<function>Opposite</function>,
+<olink targetdoc='libX11' targetptr='Configuring_Windows' >BLAH</olink>
+in <olink targetptr='libX11' targetdoc='libX11'>Xlib â€” C Language X Interface.</olink>.
+<function>XtSMDontChange</function>
+indicates that the widget wants its current stacking order preserved.
+</para>
+</sect1>
+
+<sect1 id="Resize_Requests">
+<title>Resize Requests</title>
+<para>
+To make a simple resize request from a widget, you can use
+<xref linkend='XtMakeResizeRequest' xrefstyle='select: title'/>
+as an alternative to
+<xref linkend='XtMakeGeometryRequest' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtMakeResizeRequest'>
+<funcprototype>
+<funcdef>typedef XtGeometryResult <function>XtMakeResizeRequest</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>Dimension <parameter>width</parameter></paramdef>
+   <paramdef>Dimension *<parameter>width_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget making the request.  Must be of class RectObj or any subclass thereof.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the desired widget width and height.
+      </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.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height_return</emphasis>
+    </term>
+    <listitem>
+     <para></para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+
+<para>
+The
+<xref linkend='XtMakeResizeRequest' xrefstyle='select: title'/>
+function, a simple interface to
+<xref linkend='XtMakeGeometryRequest' xrefstyle='select: title'/>,
+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
+<xref linkend='XtMakeResizeRequest' xrefstyle='select: title'/>
+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>
+</sect1>
+
+<sect1 id="Potential_Geometry_Changes">
+<title>Potential Geometry Changes</title>
+<para>
+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>
+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>
+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>
+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>
+</sect1>
+
+<sect1 id="Child_Geometry_Management_The_geometry_manager_Procedure">
+<title>Child Geometry Management: The geometry_manager Procedure</title>
+<para>
+The geometry_manager procedure pointer in a composite widget class is of type
+<xref linkend='XtGeometryHandler' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtGeometryHandler'>
+<funcprototype>
+<funcdef>XtGeometryResult <function>*XtGeometryHandler</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>XtWidgetGeometry *<parameter>request</parameter></paramdef>
+   <paramdef>XtWidgetGeometry *<parameter>geometry_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+A class can inherit its superclass's geometry manager during class
+initialization.
+</para>
+
+<para>
+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>
+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
+<xref linkend='XtMakeGeometryRequest' xrefstyle='select: title'/>.
+</para>
+
+<para>
+Homogeneous composite widgets often find it convenient to treat the widget
+making the request the same as any other widget, including reconfiguring
+it using
+<xref linkend='XtConfigureWidget' xrefstyle='select: title'/>
+or
+<xref linkend='XtResizeWidget' xrefstyle='select: title'/>
+as part of its layout process, unless
+<function>XtCWQueryOnly</function>
+is specified.
+If it does this,
+it should return
+<function>XtGeometryDone</function>
+to inform
+<xref linkend='XtMakeGeometryRequest' xrefstyle='select: title'/>
+that it does not need to do the configuration itself.
+</para>
+
+<note>
+<para>
+To remain
+compatible with layout techniques used in older widgets (before
+<function>XtGeometryDone</function>
+was added to the Intrinsics), a geometry manager should avoid using
+<xref linkend='XtResizeWidget' xrefstyle='select: title'/>
+or
+<xref linkend='XtConfigureWidget' xrefstyle='select: title'/>
+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.
+</para>
+</note>
+
+<para>
+Although
+<xref linkend='XtMakeGeometryRequest' xrefstyle='select: title'/>
+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>
+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>
+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-&gt;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-&gt;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>
+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
+<xref linkend='XtMakeGeometryRequest' xrefstyle='select: title'/>.
+</para>
+
+<para>
+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>
+To return
+<function>XtGeometryYes</function>,
+the geometry manager frequently rearranges the position of other managed
+children by calling
+<xref linkend='XtMoveWidget' xrefstyle='select: title'/>.
+However, a few geometry managers may sometimes change the
+size of other managed children by calling
+<xref linkend='XtResizeWidget' xrefstyle='select: title'/>
+or
+<xref linkend='XtConfigureWidget' xrefstyle='select: title'/>.
+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>
+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>
+</sect1>
+
+<sect1 id="Widget_Placement_and_Sizing">
+<title>Widget Placement and Sizing</title>
+<para>
+To move a sibling widget of the child making the geometry request,
+the parent uses
+<xref linkend='XtMoveWidget' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtMoveWidget'>
+<funcprototype>
+<funcdef>void <function>XtMoveWidget</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>Position <parameter>x</parameter></paramdef>
+   <paramdef>Position <parameter>y</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget.  Must be of class RectObj or any subclass thereof.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+     <para></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>
+The
+<xref linkend='XtMoveWidget' xrefstyle='select: title'/>
+function returns immediately if the specified geometry fields
+are the same as the old values.
+Otherwise,
+<xref linkend='XtMoveWidget' xrefstyle='select: title'/>
+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.
+</para>
+
+<para>
+To resize a sibling widget of the child making the geometry request,
+the parent uses
+<xref linkend='XtResizeWidget' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtResizeWidget'>
+<funcprototype>
+<funcdef>void <function>XtResizeWidget</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>Dimension <parameter>width</parameter></paramdef>
+   <paramdef>Dimension <parameter>height</parameter></paramdef>
+   <paramdef>Dimension <parameter>border_width</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget.  Must be of class RectObj or any subclass thereof.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width</emphasis>
+    </term>
+    <listitem>
+     <para></para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height</emphasis>
+    </term>
+    <listitem>
+     <para></para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>border_width</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the new widget size.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtResizeWidget' xrefstyle='select: title'/>
+function returns immediately if the specified geometry fields
+are the same as the old values.
+Otherwise,
+<xref linkend='XtResizeWidget' xrefstyle='select: title'/>
+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>
+If the new width or height is different from the old values,
+<xref linkend='XtResizeWidget' xrefstyle='select: title'/>
+calls the object's resize procedure to notify it of the size change.
+</para>
+
+<para>
+To move and resize the sibling widget of the child making the geometry request,
+the parent uses
+<xref linkend='XtConfigureWidget' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtConfigureWidget'>
+<funcprototype>
+<funcdef>void <function>XtConfigureWidget</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>Position <parameter>x</parameter></paramdef>
+   <paramdef>Position <parameter>y</parameter></paramdef>
+   <paramdef>Dimension <parameter>width</parameter></paramdef>
+   <paramdef>Dimension <parameter>height</parameter></paramdef>
+   <paramdef>Dimension <parameter>border_width</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget.  Must be of class RectObj or any subclass thereof.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+     <para></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></para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height</emphasis>
+    </term>
+    <listitem>
+     <para></para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>border_width</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the new widget size.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtConfigureWidget' xrefstyle='select: title'/>
+function returns immediately if the specified new geometry fields
+are all equal to the current values.
+Otherwise,
+<xref linkend='XtConfigureWidget' xrefstyle='select: title'/>
+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>
+If the new width or height is different from its old value,
+<xref linkend='XtConfigureWidget' xrefstyle='select: title'/>
+calls the object's resize procedure to notify it of the size change;
+otherwise, it simply returns.
+</para>
+
+<para>
+To resize a child widget that already has the new values of its width,
+height, and border width, the parent uses
+<xref linkend='XtResizeWindow' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtResizeWindow'>
+<funcprototype>
+<funcdef>void <function>XtResizeWindow</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget.  Must be of class Core or any subclass thereof.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtResizeWindow' xrefstyle='select: title'/>
+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>
+There are very few times to use
+<xref linkend='XtResizeWindow' xrefstyle='select: title'/>;
+instead, the parent should use
+<xref linkend='XtResizeWidget' xrefstyle='select: title'/>.
+</para>
+</sect1>
+
+<sect1 id="Preferred_Geometry">
+<title>Preferred Geometry</title>
+<para>
+Some parents may be willing to adjust their layouts to accommodate the
+preferred geometries of their children.
+They can use
+<xref linkend='XtQueryGeometry' xrefstyle='select: title'/>
+to obtain the preferred geometry
+and, as they see fit, can use or ignore any portion of the response.
+</para>
+
+<para>
+To query a child widget's preferred geometry, use
+<xref linkend='XtQueryGeometry' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtQueryGeometry'>
+<funcprototype>
+<funcdef>XtGeometryResult <function>XtQueryGeometry</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>XtWidgetGeometry *<parameter>intended</parameter></paramdef>
+   <paramdef>XtWidgetGeometry *<parameter>preferred_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget.  Must be of class RectObj or any subclass thereof.
+      </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>
+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
+<xref linkend='XtQueryGeometry' xrefstyle='select: title'/>.
+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>
+<xref linkend='XtQueryGeometry' xrefstyle='select: title'/>
+clears all bits in the <emphasis remap='I'>preferred_return-&gt;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,
+<xref linkend='XtQueryGeometry' xrefstyle='select: title'/>
+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,
+<xref linkend='XtQueryGeometry' xrefstyle='select: title'/>
+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.
+</para>
+
+<note>
+<para>
+If
+<xref linkend='XtQueryGeometry' xrefstyle='select: title'/>
+is called from within a geometry_manager
+procedure for the widget that issued
+<xref linkend='XtMakeGeometryRequest' xrefstyle='select: title'/>
+or
+<xref linkend='XtMakeResizeRequest' xrefstyle='select: title'/>,
+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.
+</para>
+</note>
+
+<para>
+The query_geometry procedure pointer is of type
+<xref linkend='XtGeometryHandler' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='_XtGeometryHandler'>
+<funcprototype>
+<funcdef>typedef XtGeometryResult <function>(*XtGeometryHandler)</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>XtWidgetGeometry *<parameter>request</parameter></paramdef>
+   <paramdef>XtWidgetGeometry *<parameter>preferred_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The query_geometry procedure is expected to examine the bits set in
+<emphasis remap='I'>request-&gt;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-&gt;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-&gt;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-&gt;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>.
+</para>
+
+<note><para>
+The query_geometry procedure may assume
+that no
+<xref linkend='XtMakeResizeRequest' xrefstyle='select: title'/>
+or
+<xref linkend='XtMakeGeometryRequest' xrefstyle='select: title'/>
+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.
+</para></note>
+
+<para>
+After calling the query_geometry procedure
+or if the <emphasis remap='I'>query_geometry</emphasis> field is NULL,
+<xref linkend='XtQueryGeometry' xrefstyle='select: title'/>
+examines all the unset bits in <emphasis remap='I'>preferred_return-&gt;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>.
+<xref linkend='XtQueryGeometry' xrefstyle='select: title'/>
+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>
+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>
+Parents are expected to call
+<xref linkend='XtQueryGeometry' xrefstyle='select: title'/>
+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>
+</sect1>
+
+<sect1 id="Size_Change_Management_The_resize_Procedure">
+<title>Size Change Management: The resize Procedure</title>
+<para>
+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
+<xref linkend='XtResizeWidget' xrefstyle='select: title'/>,
+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
+<xref linkend='XtWidgetProc' xrefstyle='select: title'/>.
+</para>
+
+<para>
+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
+<xref linkend='XtMakeGeometryRequest' xrefstyle='select: title'/>
+or
+<xref linkend='XtMakeResizeRequest' xrefstyle='select: title'/>
+call from its resize procedure.
+</para>
+</sect1>
+</chapter>
diff --git a/specs/CH07.xml b/specs/CH07.xml
new file mode 100644 (file)
index 0000000..7ea7259
--- /dev/null
@@ -0,0 +1,4989 @@
+<chapter id='Event_Management'>
+<title>Event Management</title>
+<para>
+While Xlib allows the reading and processing of events anywhere in an application,
+widgets in the X Toolkit 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>
+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 Intrinsics is
+<xref linkend='XtAppMainLoop' xrefstyle='select: title'/>.
+</para>
+
+<para>
+The event manager is a collection of functions to perform the following tasks:
+</para>
+<itemizedlist spacing='compact'>
+  <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 Intrinsics will block.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Enable safe operation in a multi-threaded environment.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+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
+<xref linkend='XtAppMainLoop' xrefstyle='select: title'/>.
+</para>
+<sect1 id="Adding_and_Deleting_Additional_Event_Sources">
+<title>Adding and Deleting Additional Event Sources</title>
+<para>
+While most applications are driven only by X events,
+some applications need to incorporate other sources of input
+into the Intrinsics event-handling mechanism.
+The event manager provides routines to integrate notification of timer events
+and file data pending into this mechanism.
+</para>
+
+<para>
+The next section describes functions that provide input gathering from files.
+The application registers the files with the Intrinsics read routine.
+When input is pending on one of the files,
+the registered callback procedures are invoked.
+</para>
+<sect2 id="Adding_and_Removing_Input_Sources">
+<title>Adding and Removing Input Sources</title>
+<para>
+To register a new file as an input source for a given application context, use
+<xref linkend='XtAppAddInput' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppAddInput'>
+<funcprototype>
+<funcdef>XtInputId <function>XtAppAddInput</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+   <paramdef>int <parameter>source</parameter></paramdef>
+   <paramdef>XtPointer <parameter>condition</parameter></paramdef>
+   <paramdef>XtInputCallbackProc <parameter>proc</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtAppAddInput' xrefstyle='select: title'/>
+function registers with the Intrinsics 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.
+<xref linkend='XtAppAddInput' xrefstyle='select: title'/>
+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>
+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:
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis role='strong'>XtInputReadMask</emphasis>
+    </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.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis role='strong'>XtInputWriteMask</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies that <emphasis remap='I'>proc</emphasis> is to be called when <emphasis remap='I'>source</emphasis> is ready
+for writing.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis role='strong'>XtInputExceptMask</emphasis>
+    </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>
+Callback procedure pointers used to handle file events are of
+type
+<xref linkend='XtInputCallbackProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtInputCallbackProc'>
+<funcprototype>
+<funcdef>typedef void <function>(*XtInputCallbackProc)</function></funcdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+   <paramdef>int *<parameter>source</parameter></paramdef>
+   <paramdef>XtInputId *<parameter>id</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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
+<xref linkend='XtAppAddInput' xrefstyle='select: title'/>
+call.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+See <xref linkend='Using_the_Intrinsics_in_a_Multi_Threaded_Environment' />
+for information regarding the use of
+<xref linkend='XtAppAddInput' xrefstyle='select: title'/>
+in multiple threads.
+</para>
+
+<para>
+To discontinue a source of input, use
+<xref linkend='XtRemoveInput' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtRemoveInput'>
+<funcprototype>
+<funcdef>void <function>XtRemoveInput</function></funcdef>
+   <paramdef>XtInputId <parameter>id</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>id</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the id returned from the corresponding
+<xref linkend='XtAppAddInput' xrefstyle='select: title'/>
+call.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtRemoveInput' xrefstyle='select: title'/>
+function causes the Intrinsics read routine to stop watching for events
+from the file source specified by <emphasis remap='I'>id</emphasis>.
+</para>
+
+<para>
+See <xref linkend='Using_the_Intrinsics_in_a_Multi_Threaded_Environment' />
+for information regarding the use of
+<xref linkend='XtRemoveInput' xrefstyle='select: title'/>
+in multiple threads.
+</para>
+</sect2>
+
+<sect2 id="Adding_and_Removing_Blocking_Notifications">
+<title>Adding and Removing Blocking Notifications</title>
+<para>
+Occasionally it is desirable for an application to receive notification
+when the Intrinsics 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.
+</para>
+
+<para>
+To register a hook that is called immediately prior to event blocking, use
+<xref linkend='XtAppAddBlockHook' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppAddBlockHook'>
+<funcprototype>
+<funcdef>XtBlockHookId <function>XtAppAddBlockHook</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+   <paramdef>XtBlockHookProc <parameter>proc</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtAppAddBlockHook' xrefstyle='select: title'/>
+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 Intrinsics are about to block pending some input.
+</para>
+
+<para>
+The procedure pointers used to provide notification of event blocking
+are of type
+<xref linkend='XtBlockHookProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtBlockHookProc'>
+<funcprototype>
+<funcdef>void <function>*XtBlockHookProc</function></funcdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+To discontinue the use of a procedure for blocking notification, use
+<xref linkend='XtRemoveBlockHook' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtRemoveBlockHook'>
+<funcprototype>
+<funcdef>void <function>XtRemoveBlockHook</function></funcdef>
+   <paramdef>XtBlockHookId <parameter>id</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>id</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the identifier returned from the corresponding call to
+<xref linkend='XtAppAddBlockHook' xrefstyle='select: title'/>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtRemoveBlockHook' xrefstyle='select: title'/>
+function removes the specified procedure from the list of procedures
+that are called by the Intrinsics read routine before blocking on event sources.
+</para>
+</sect2>
+
+<sect2 id="Adding_and_Removing_Timeouts">
+<title>Adding and Removing Timeouts</title>
+<para>
+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.
+</para>
+
+<para>
+To register a timeout callback, use
+<xref linkend='XtAppAddTimeOut' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppAddTimeOut'>
+<funcprototype>
+<funcdef>XtIntervalId <function>XtAppAddTimeOut</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+   <paramdef>unsigned long <parameter>interval</parameter></paramdef>
+   <paramdef>XtTimerCallbackProc <parameter>proc</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtAppAddTimeOut' xrefstyle='select: title'/>
+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
+<xref linkend='XtAppNextEvent' xrefstyle='select: title'/>
+or
+<xref linkend='XtAppProcessEvent' xrefstyle='select: title'/>
+is next called after the time interval elapses,
+and then the timeout is removed.
+</para>
+
+<para>
+Callback procedure pointers used with timeouts are of
+type
+<xref linkend='XtTimerCallbackProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtTimerCallbackProc'>
+<funcprototype>
+<funcdef>void <function>*XtTimerCallbackProc</function></funcdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+   <paramdef>XtIntervalId *<parameter>timer</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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
+<xref linkend='XtAppAddTimeOut' xrefstyle='select: title'/>
+call.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+See <xref linkend='Using_the_Intrinsics_in_a_Multi_Threaded_Environment' />
+for information regarding the use of
+<xref linkend='XtAppAddTimeOut' xrefstyle='select: title'/>
+in multiple threads.
+</para>
+
+<para>
+To clear a timeout value, use
+<xref linkend='XtRemoveTimeOut' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtRemoveTimeOut'>
+<funcprototype>
+<funcdef>void <function>XtRemoveTimeOut</function></funcdef>
+   <paramdef>XtIntervalId <parameter>timer</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtRemoveTimeOut' xrefstyle='select: title'/>
+function removes the pending timeout.
+Note that timeouts are automatically removed once they trigger.
+</para>
+
+<para>
+Please refer to Section 7.12 for information regarding the use of
+<xref linkend='XtRemoveTimeOut' xrefstyle='select: title'/>
+in multiple threads.
+</para>
+</sect2>
+
+<sect2 id="Adding_and_Removing_Signal_Callbacks">
+<title>Adding and Removing Signal Callbacks</title>
+<para>
+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.
+</para>
+
+<para>
+Prior to establishing a signal handler, the application or widget should
+call
+<xref linkend='XtAppAddSignal' xrefstyle='select: title'/>
+and store the resulting identifier in a place accessible to the signal
+handler.  When a signal arrives, the signal handler should call
+<xref linkend='XtNoticeSignal' xrefstyle='select: title'/>
+to notify the Intrinsics that a signal has occured.  To register a signal
+callback use
+<xref linkend='XtAppAddSignal' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppAddSignal'>
+<funcprototype>
+<funcdef>XtSignalId <function>XtAppAddSignal</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+   <paramdef>XtSignalCallbackProc <parameter>proc</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The callback procedure pointers used to handle signal events are of type
+<xref linkend='XtSignalCallbackProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtSignalCallbackProc'>
+<funcprototype>
+<funcdef>typedef void <function>(*XtSignalCallbackProc)</function></funcdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+   <paramdef>XtSignalId *<parameter>id</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>client_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Passes the client data argument that was registered for this procedure in
+<xref linkend='XtAppAddSignal' xrefstyle='select: title'/>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>id</emphasis>
+    </term>
+    <listitem>
+      <para>
+Passes the id returned from the corresponding
+<xref linkend='XtAppAddSignal' xrefstyle='select: title'/>
+call.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+To notify the Intrinsics that a signal has occured, use
+<xref linkend='XtNoticeSignal' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtNoticeSignal'>
+<funcprototype>
+<funcdef>void <function>XtNoticeSignal</function></funcdef>
+   <paramdef>XtSignalId <parameter>id</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>id</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the id returned from the corresponding
+<xref linkend='XtAppAddSignal' xrefstyle='select: title'/>
+call.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+On a POSIX-based system,
+<xref linkend='XtNoticeSignal' xrefstyle='select: title'/>
+is the only Intrinsics function that can safely be called from a signal handler.
+If
+<xref linkend='XtNoticeSignal' xrefstyle='select: title'/>
+is invoked multiple times before the Intrinsics are able to invoke the
+registered callback, the callback is only called once.
+Logically, the Intrinsics maintain ``pending'' flag for each registered callback.
+This flag is initially
+<function>False</function>
+and is set to
+<function>True</function>
+by
+<xref linkend='XtNoticeSignal' xrefstyle='select: title'/>.
+When
+<xref linkend='XtAppNextEvent' xrefstyle='select: title'/>
+or
+<xref linkend='XtAppProcessEvent' xrefstyle='select: title'/>
+(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>
+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 Intrinsics never block signals from being raised, so if a given
+signal can be raised multiple times before the Intrinsics 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 Intrinsics
+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 Intrinsics 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>
+To remove a registered signal callback, call
+<xref linkend='XtRemoveSignal' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtRemoveSignal'>
+<funcprototype>
+<funcdef>void <function>XtRemoveSignal</function></funcdef>
+   <paramdef>XtSignalId <parameter>id</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>id</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the id returned by the corresponding call to
+<xref linkend='XtAppAddSignal' xrefstyle='select: title'/>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The client should typically disable the source of the signal before calling
+<xref linkend='XtRemoveSignal' xrefstyle='select: title'/>.
+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
+<xref linkend='XtRemoveSignal' xrefstyle='select: title'/>
+the client can test for signals with
+<xref linkend='XtAppPending' xrefstyle='select: title'/>
+and process them by calling
+<xref linkend='XtAppProcessEvent' xrefstyle='select: title'/>
+with the mask
+<function>XtIMSignal</function>.
+</para>
+</sect2>
+</sect1>
+
+<sect1 id="Constraining_Events_to_a_Cascade_of_Widgets">
+<title>Constraining Events to a Cascade of Widgets</title>
+<para>
+Modal widgets are widgets that, except for the input directed to them,
+lock out user input to the application.
+</para>
+
+<para>
+When a modal menu or modal dialog box is popped up using
+<xref linkend='XtPopup' xrefstyle='select: title'/>,
+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>
+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>
+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>
+<xref linkend='XtPopup' xrefstyle='select: title'/>
+uses the
+<xref linkend='XtAddGrab' xrefstyle='select: title'/>
+and
+<xref linkend='XtRemoveGrab' xrefstyle='select: title'/>
+functions to constrain user events to a modal cascade
+and subsequently to remove a grab when the modal widget is popped down.
+</para>
+
+<para>
+To constrain or redirect user input to a modal widget, use
+<xref linkend='XtAddGrab' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAddGrab'>
+<funcprototype>
+<funcdef>void <function>XtAddGrab</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>Boolean <parameter>exclusive</parameter></paramdef>
+   <paramdef>Boolean <parameter>spring_loaded</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget to add to the modal cascade. Must be of class Core or any subclass thereof.
+      </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>
+The
+<xref linkend='XtAddGrab' xrefstyle='select: title'/>
+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,
+<xref linkend='XtAddGrab' xrefstyle='select: title'/>
+generates a warning message.
+</para>
+
+<para>
+The modal cascade is used by
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>
+when it tries to dispatch a user event.
+When at least one modal widget is in the widget cascade,
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>
+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>
+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>
+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 Intrinsics do not modify
+the contents of the event.
+</para>
+
+<para>
+To remove the redirection of user input to a modal widget, use
+<xref linkend='XtRemoveGrab' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtRemoveGrab'>
+<funcprototype>
+<funcdef>void <function>XtRemoveGrab</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtRemoveGrab' xrefstyle='select: title'/>
+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>
+<sect2 id="Requesting_Key_and_Button_Grabs">
+<title>Requesting Key and Button Grabs</title>
+<para>
+The Intrinsics provide a set of key and button grab interfaces that
+are parallel to those provided by Xlib and that allow the Intrinsics
+to modify event dispatching when necessary.  X Toolkit applications and
+widgets that need to passively grab keys or buttons or actively grab
+the keyboard or pointer should use the
+following Intrinsics routines rather than the corresponding Xlib
+routines.
+</para>
+
+<para>
+To passively grab a single key of the keyboard, use
+<xref linkend='XtGrabKey' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtGrabKey'>
+<funcprototype>
+<funcdef>void <function>XtGrabKey</function></funcdef>
+   <paramdef>Widget <parameter>widget</parameter></paramdef>
+   <paramdef>KeyCode <parameter>keycode</parameter></paramdef>
+   <paramdef>Modifiers <parameter>modifiers</parameter></paramdef>
+   <paramdef>Boolean <parameter>owner_events</parameter></paramdef>
+   <paramdef>int <parameter>pointer_mode</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>widget</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget in whose window the key is to be grabbed.  Must be of class Core or any subclass thereof.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keycode</emphasis>
+    </term>
+    <term>
+      <emphasis remap='I'>modifiers</emphasis>
+    </term>
+    <term>
+      <emphasis remap='I'>owner_events</emphasis>
+    </term>
+    <term>
+      <emphasis remap='I'>pointer_mode</emphasis>
+    </term>
+    <term>
+      <emphasis remap='I'>keyboard_mode</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify arguments to
+<function>XGrabKey</function>;
+see <olink targetdoc='libX11' targetptr='Keyboard_Grabbing'>Section 12.2</olink>
+in <olink targetdoc='libX11' targetptr='libX11'>Xlib â€” C Language X Interface</olink>.
+
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<xref linkend='XtGrabKey' xrefstyle='select: title'/>
+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
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>
+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 Intrinsics will call
+<xref linkend='XtUngrabKeyboard' xrefstyle='select: title'/>
+with the timestamp from the
+<function>KeyPress</function>
+event if either of the following conditions is true:
+</para>
+<itemizedlist spacing='compact'>
+  <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>.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+To cancel a passive key grab, use
+<xref linkend='XtUngrabKey' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtUngrabKey'>
+<funcprototype>
+<funcdef>void <function>XtUngrabKey</function></funcdef>
+   <paramdef>Widget <parameter>widget</parameter></paramdef>
+   <paramdef>KeyCode <parameter>keycode</parameter></paramdef>
+   <paramdef>Modifiers <parameter>modifiers</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>widget</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget in whose window the key was grabbed.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keycode</emphasis>
+    </term>
+    <term>
+      <emphasis remap='I'>modifiers</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify arguments to
+<function>XUngrabKey</function>;
+see <olink targetdoc='libX11' targetptr='Keyboard_Grabbing'>Section 12.2</olink>
+in <olink targetdoc='libX11' targetptr='libX11'>Xlib â€” C Language X Interface</olink>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtUngrabKey' xrefstyle='select: title'/>
+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,
+<xref linkend='XtUngrabKey' xrefstyle='select: title'/>
+removes a deferred
+<xref linkend='XtGrabKey' xrefstyle='select: title'/>
+request, if any, for the specified widget, keycode, and modifiers.
+</para>
+
+<para>
+To actively grab the keyboard, use
+<xref linkend='XtGrabKeyboard' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtGrabKeyboard'>
+<funcprototype>
+<funcdef>int <function>XtGrabKeyboard</function></funcdef>
+   <paramdef>Widget <parameter>widget</parameter></paramdef>
+   <paramdef>Boolean <parameter>owner_events</parameter></paramdef>
+   <paramdef>int <parameter>pointer_mode</parameter></paramdef>
+   <paramdef>Time <parameter>time</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>widget</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget for whose window the keyboard is to be grabbed.
+Must be of class Core or any subclass thereof.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>owner_events</emphasis>
+    </term>
+    <term>
+      <emphasis remap='I'>pointer_mode</emphasis>
+    </term>
+    <term>
+      <emphasis remap='I'>keyboard_mode</emphasis>
+    </term>
+    <term>
+      <emphasis remap='I'>time</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify arguments to
+<function>XGrabKeyboard</function>;
+see <olink targetdoc='libX11' targetptr='Keyboard_Grabbing'>Section 12.2</olink>
+in <olink targetdoc='libX11' targetptr='libX11'>Xlib â€” C Language X Interface</olink>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+If the specified widget is realized,
+<xref linkend='XtGrabKeyboard' xrefstyle='select: title'/>
+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,
+<xref linkend='XtGrabKeyboard' xrefstyle='select: title'/>
+immediately returns
+<function>GrabNotViewable</function>.
+No future automatic ungrab is implied by
+<xref linkend='XtGrabKeyboard' xrefstyle='select: title'/>.
+</para>
+
+<para>
+To cancel an active keyboard grab, use
+<xref linkend='XtUngrabKeyboard' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtUngrabKeyboard'>
+<funcprototype>
+<funcdef>void <function>XtUngrabKeyboard</function></funcdef>
+   <paramdef>Widget <parameter>widget</parameter></paramdef>
+   <paramdef>Time <parameter>time</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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 <olink targetdoc='libX11' targetptr='Keyboard_Grabbing'>Section 12.2</olink>
+in <olink targetdoc='libX11' targetptr='libX11'>Xlib â€” C Language X Interface</olink>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<xref linkend='XtUngrabKeyboard' xrefstyle='select: title'/>
+calls
+<function>XUngrabKeyboard</function>
+with the specified time.
+</para>
+
+<para>
+To passively grab a single pointer button, use
+<xref linkend='XtGrabButton' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtGrabButton'>
+<funcprototype>
+<funcdef>void <function>XtGrabButton</function></funcdef>
+   <paramdef>Widget <parameter>widget</parameter></paramdef>
+   <paramdef>int <parameter>button</parameter></paramdef>
+   <paramdef>Modifiers <parameter>modifiers</parameter></paramdef>
+   <paramdef>Boolean <parameter>owner_events</parameter></paramdef>
+   <paramdef>unsigned int <parameter>event_mask</parameter></paramdef>
+   <paramdef>int <parameter>pointer_mode</parameter></paramdef>
+   <paramdef>Window <parameter>confine_to</parameter></paramdef>
+   <paramdef>Cursor <parameter>cursor</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>widget</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget in whose window the button is to be grabbed.  Must be of class Core or any subclass thereof.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>button</emphasis>
+    </term>
+    <term>
+      <emphasis remap='I'>modifiers</emphasis>
+    </term>
+    <term>
+      <emphasis remap='I'>owner_events</emphasis>
+    </term>
+    <term>
+      <emphasis remap='I'>event_mask</emphasis>
+    </term>
+    <term>
+      <emphasis remap='I'>pointer_mode</emphasis>
+    </term>
+    <term>
+      <emphasis remap='I'>keyboard_mode</emphasis>
+    </term>
+    <term>
+      <emphasis remap='I'>confine_to</emphasis>
+    </term>
+    <term>
+      <emphasis remap='I'>cursor</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify arguments to
+<function>XGrabButton</function>;
+see <olink targetdoc='libX11' targetptr='Pointer_Grabbing'>Section 12.1</olink>
+in <olink targetdoc='libX11' targetptr='libX11'>Xlib â€” C Language X Interface</olink>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<xref linkend='XtGrabButton' xrefstyle='select: title'/>
+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
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>
+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 Intrinsics will call
+<xref linkend='XtUngrabPointer' xrefstyle='select: title'/>
+with the timestamp from the
+<function>ButtonPress</function>
+event if either of the following conditions is true:
+</para>
+<itemizedlist spacing='compact'>
+  <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>.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+To cancel a passive button grab, use
+<xref linkend='XtUngrabButton' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtUngrabButton'>
+<funcprototype>
+<funcdef>void <function>XtUngrabButton</function></funcdef>
+   <paramdef>Widget <parameter>widget</parameter></paramdef>
+   <paramdef>unsigned int <parameter>button</parameter></paramdef>
+   <paramdef>Modifiers <parameter>modifiers</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+    <term>
+      <emphasis remap='I'>modifiers</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify arguments to
+<function>XUngrabButton</function>;
+see <olink targetdoc='libX11' targetptr='Pointer_Grabbing'>Section 12.1</olink>
+in <olink targetdoc='libX11' targetptr='libX11'>Xlib â€” C Language X Interface</olink>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtUngrabButton' xrefstyle='select: title'/>
+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,
+<xref linkend='XtUngrabButton' xrefstyle='select: title'/>
+removes a deferred
+<xref linkend='XtGrabButton' xrefstyle='select: title'/>
+request, if any, for the specified widget, button, and modifiers.
+</para>
+
+<para>
+To actively grab the pointer, use
+<xref linkend='XtGrabPointer' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtGrabPointer'>
+<funcprototype>
+<funcdef>int <function>XtGrabPointer</function></funcdef>
+   <paramdef>Widget <parameter>widget</parameter></paramdef>
+   <paramdef>Boolean <parameter>owner_events</parameter></paramdef>
+   <paramdef>unsigned int <parameter>event_mask</parameter></paramdef>
+   <paramdef>int <parameter>pointer_mode</parameter></paramdef>
+   <paramdef>Window <parameter>confine_to</parameter></paramdef>
+   <paramdef>Cursor <parameter>cursor</parameter></paramdef>
+   <paramdef>Time <parameter>time</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>widget</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget for whose window the pointer is to be grabbed.  Must be of class Core or any subclass thereof.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>owner_events</emphasis>
+    </term>
+    <term>
+      <emphasis remap='I'>event_mask</emphasis>
+    </term>
+    <term>
+      <emphasis remap='I'>pointer_mode</emphasis>
+    </term>
+    <term>
+      <emphasis remap='I'>keyboard_mode</emphasis>
+    </term>
+    <term>
+      <emphasis remap='I'>confine_to</emphasis>
+    </term>
+    <term>
+      <emphasis remap='I'>cursor</emphasis>
+    </term>
+    <term>
+      <emphasis remap='I'>time</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify arguments to
+<function>XGrabPointer</function>;
+see <olink targetdoc='libX11' targetptr='Pointer_Grabbing'>Section 12.1</olink>
+in <olink targetdoc='libX11' targetptr='libX11'>Xlib â€” C Language X Interface</olink>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+If the specified widget is realized,
+<xref linkend='XtGrabPointer' xrefstyle='select: title'/>
+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,
+<xref linkend='XtGrabPointer' xrefstyle='select: title'/>
+immediately returns
+<function>GrabNotViewable</function>.
+No future automatic ungrab is implied by
+<xref linkend='XtGrabPointer' xrefstyle='select: title'/>.
+</para>
+
+<para>
+To cancel an active pointer grab, use
+<xref linkend='XtUngrabPointer' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtUngrabPointer'>
+<funcprototype>
+<funcdef>void <function>XtUngrabPointer</function></funcdef>
+   <paramdef>Widget <parameter>widget</parameter></paramdef>
+   <paramdef>Time <parameter>time</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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 <olink targetdoc='libX11' targetptr='Pointer_Grabbing'>Section 12.1</olink>
+in <olink targetdoc='libX11' targetptr='libX11'>Xlib â€” C Language X Interface</olink>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<xref linkend='XtUngrabPointer' xrefstyle='select: title'/>
+calls
+<function>XUngrabPointer</function>
+with the specified time.
+</para>
+</sect2>
+</sect1>
+
+<sect1 id="Focusing_Events_on_a_Child">
+<title>Focusing Events on a Child</title>
+<para>
+To redirect keyboard input to a normal descendant of a
+widget without calling
+<function>XSetInputFocus</function>,
+use
+<xref linkend='XtSetKeyboardFocus' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtSetKeyboardFocus'>
+<funcprototype>
+<funcdef>void <function>XtSetKeyboardFocus</function></funcdef>
+   <paramdef>Widget <parameter>subtree</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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.  Must be of class Core or any subclass thereof.
+      </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.  Must be of class Object or any subclass thereof.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<xref linkend='XtSetKeyboardFocus' xrefstyle='select: title'/>
+causes
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>
+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>
+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 spacing='compact'>
+  <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
+<xref linkend='XtGrabKey' xrefstyle='select: title'/>
+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
+<xref linkend='XtGrabKeyboard' xrefstyle='select: title'/>
+or
+<xref linkend='XtGrabKey' xrefstyle='select: title'/>
+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.
+    </para>
+  </listitem>
+  <listitem>
+    <itemizedlist spacing='compact'>
+      <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
+<xref linkend='XtGrabKey' xrefstyle='select: title'/>
+for E,
+<xref linkend='XtUngrabKeyboard' xrefstyle='select: title'/>
+is called.
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+If E is an ancestor of F, and the event is a key press, and either
+        </para>
+      </listitem>
+      <listitem>
+        <itemizedlist spacing='compact'>
+          <listitem>
+            <para>
+E has grabbed the key with
+<xref linkend='XtGrabKey' xrefstyle='select: title'/>
+and <emphasis remap='I'>owner_events</emphasis>
+<function>False</function>,
+or
+            </para>
+          </listitem>
+          <listitem>
+            <para>
+E has grabbed the key with
+<xref linkend='XtGrabKey' xrefstyle='select: title'/>
+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,
+then the event is dispatched to E.
+            </para>
+          </listitem>
+        </itemizedlist>
+      </listitem>
+      <listitem>
+        <para>
+Otherwise, define A as the closest common ancestor of E and F:
+        </para>
+      </listitem>
+      <listitem>
+        <itemizedlist spacing='compact'>
+          <listitem>
+            <para>
+If there is an active keyboard grab for any widget via either
+<xref linkend='XtGrabKeyboard' xrefstyle='select: title'/>
+or
+<xref linkend='XtGrabKey' xrefstyle='select: title'/>
+on a previous key press, or
+if no widget between F and A (noninclusive) has grabbed
+the key and modifier combination with
+<xref linkend='XtGrabKey' xrefstyle='select: title'/>
+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
+<xref linkend='XtGrabKey' xrefstyle='select: title'/>.
+            </para>
+          </listitem>
+        </itemizedlist>
+      </listitem>
+    </itemizedlist>
+  </listitem>
+</itemizedlist>
+<para>
+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 Intrinsics do not modify
+the contents of the event.
+</para>
+
+<para>
+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.
+</para>
+
+<para>
+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>
+The accept_focus procedure pointer is of type
+<xref linkend='XtAcceptFocusProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAcceptFocusProc'>
+<funcprototype>
+<funcdef>Boolean <function>*XtAcceptFocusProc</function></funcdef>
+
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>Time *<parameter>time</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+Widgets that need the input focus can call
+<function>XSetInputFocus</function>
+explicitly, pursuant to the restrictions of the <emphasis remap='I'>Inter-Client Communication Conventions Manual.</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.
+</para>
+
+<para>
+To call a widget's accept_focus procedure, use
+<xref linkend='XtCallAcceptFocus' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtCallAcceptFocus'>
+<funcprototype>
+<funcdef>Boolean <function>XtCallAcceptFocus</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>Time *<parameter>time</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget.  Must be of class Core or any subclass thereof.
+      </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>
+The
+<xref linkend='XtCallAcceptFocus' xrefstyle='select: title'/>
+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,
+<xref linkend='XtCallAcceptFocus' xrefstyle='select: title'/>
+returns
+<function>False</function>.
+</para>
+<sect2 id="Events_for_Drawables_That_Are_Not_a_Widget_s_Window">
+<title>Events for Drawables That Are Not a Widget's Window</title>
+<para>
+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>
+To register a drawable with the Intrinsics event dispatching, use
+<xref linkend='XtRegisterDrawable' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtRegisterDrawable'>
+<funcprototype>
+<funcdef>void <function>XtRegisterDrawable</function></funcdef>
+   <paramdef>Display *<parameter>display</parameter></paramdef>
+   <paramdef>Drawable <parameter>drawable</parameter></paramdef>
+   <paramdef>Widget <parameter>widget</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+<xref linkend='XtRegisterDrawable' xrefstyle='select: title'/>
+associates the specified drawable with the specified widget
+so that future calls to
+<xref linkend='XtWindowToWidget' xrefstyle='select: title'/>
+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>
+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
+<xref linkend='XtRegisterDrawable' xrefstyle='select: title'/>
+are undefined.
+</para>
+
+<para>
+To unregister a drawable with the Intrinsics event dispatching, use
+<xref linkend='XtUnregisterDrawable' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtUnregisterDrawable'>
+<funcprototype>
+<funcdef>void <function>XtUnregisterDrawable</function></funcdef>
+   <paramdef>Display *<parameter>display</parameter></paramdef>
+   <paramdef>Drawable <parameter>drawable</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+<xref linkend='XtUnregisterDrawable' xrefstyle='select: title'/>
+removes an association created with
+<xref linkend='XtRegisterDrawable' xrefstyle='select: title'/>.
+If the drawable is the window of a widget in the client's widget tree
+the results of calling
+<xref linkend='XtUnregisterDrawable' xrefstyle='select: title'/>
+are undefined.
+</para>
+</sect2>
+</sect1>
+
+<sect1 id="Querying_Event_Sources">
+<title>Querying Event Sources</title>
+<para>
+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 Intrinsics equivalents of the
+<function>XPending</function>,
+<function>XPeekEvent</function>,
+and
+<function>XNextEvent</function>
+Xlib calls.
+</para>
+
+<para>
+To determine if there are any events on the input queue for a given application,
+use
+<xref linkend='XtAppPending' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppPending'>
+<funcprototype>
+<funcdef>XtInputMask <function>XtAppPending</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtAppPending' xrefstyle='select: title'/>
+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,
+<xref linkend='XtAppPending' xrefstyle='select: title'/>
+flushes the output buffers of each Display in the application context
+and returns zero.
+</para>
+
+<para>
+To return the event from the head of a given application's input queue
+without removing input from the queue, use
+<xref linkend='XtAppPeekEvent' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppPeekEvent'>
+<funcprototype>
+<funcdef>Boolean <function>XtAppPeekEvent</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+   <paramdef>XEvent *<parameter>event_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+If there is an X event in the queue,
+<xref linkend='XtAppPeekEvent' xrefstyle='select: title'/>
+copies it into <emphasis remap='I'>event_return</emphasis> and returns
+<function>True</function>.
+If no X input is on the queue,
+<xref linkend='XtAppPeekEvent' xrefstyle='select: title'/>
+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,
+<xref linkend='XtAppPeekEvent' xrefstyle='select: title'/>
+fills in <emphasis remap='I'>event_return</emphasis> and returns
+<function>True</function>.
+Otherwise, the input is for an input source
+registered with
+<xref linkend='XtAppAddInput' xrefstyle='select: title'/>,
+and
+<xref linkend='XtAppPeekEvent' xrefstyle='select: title'/>
+returns
+<function>False</function>.
+The sample implementations provides XtAppPeekEvent as described.  Timeout callbacks
+are called while blocking for input.  If some input for an input source is
+available,
+<xref linkend='XtAppPeekEvent' xrefstyle='select: title'/>
+will return
+<function>True</function>
+without returning an event.
+</para>
+
+<para>
+To remove and return the event
+from the head of a given application's X event queue,
+use
+<xref linkend='XtAppNextEvent' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppNextEvent'>
+<funcprototype>
+<funcdef>void <function>XtAppNextEvent</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+   <paramdef>XEvent *<parameter>event_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+If the X event queue is empty,
+<xref linkend='XtAppNextEvent' xrefstyle='select: title'/>
+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 <xref linkend='Adding_Background_Work_Procedures' />.
+</para>
+</sect1>
+
+<sect1 id="Dispatching_Events">
+<title>Dispatching Events</title>
+<para>
+The Intrinsics provide functions that dispatch events
+to widgets or other application code.
+Every client interested in X events on a widget uses
+<xref linkend='XtAddEventHandler' xrefstyle='select: title'/>
+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 <xref linkend='Translation_Management' />.
+</para>
+
+<para>
+Applications that need direct control of the processing of different types
+of input should use
+<xref linkend='XtAppProcessEvent' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppProcessEvent'>
+<funcprototype>
+<funcdef>void <function>XtAppProcessEvent</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+   <paramdef>XtInputMask <parameter>mask</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtAppProcessEvent' xrefstyle='select: title'/>
+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
+<xref linkend='XtAppProcessEvent' xrefstyle='select: title'/>
+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
+<xref linkend='XtAppMainLoop' xrefstyle='select: title'/>.
+<xref linkend='XtAppProcessEvent' xrefstyle='select: title'/>
+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
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>.
+</para>
+
+<para>
+When an X event is received,
+it is passed to
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>,
+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.
+</para>
+
+<para>
+To dispatch an event returned by
+<xref linkend='XtAppNextEvent' xrefstyle='select: title'/>,
+retrieved directly from the Xlib queue, or synthetically constructed,
+to any registered event filters or event handlers, call
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtDispatchEvent'>
+<funcprototype>
+<funcdef>Boolean <function>XtDispatchEvent</function></funcdef>
+   <paramdef>XEvent *<parameter>event</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>
+function first calls
+<function>XFilterEvent</function>
+with the <emphasis remap='I'>event</emphasis> and the window of the widget to which the
+Intrinsics intend to dispatch the event, or the event window if
+the Intrinsics 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
+<xref linkend='XtGrabKey' xrefstyle='select: title'/>
+or
+<xref linkend='XtGrabButton' xrefstyle='select: title'/>,
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>
+calls
+<xref linkend='XtUngrabKeyboard' xrefstyle='select: title'/>
+or
+<xref linkend='XtUngrabPointer' xrefstyle='select: title'/>
+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,
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>
+just immediately returns
+<function>True</function>.
+Otherwise,
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>
+sends the event to the event handler functions that
+have been previously registered with the dispatch routine.
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>
+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.
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>
+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
+<xref linkend='XtAddGrab' xrefstyle='select: title'/>,
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>
+may dispatch the event a second time.  If it does so,
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>
+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>
+</sect1>
+
+<sect1 id="The_Application_Input_Loop">
+<title>The Application Input Loop</title>
+<para>
+To process all input from a given application in a continuous loop,
+use the convenience procedure
+<xref linkend='XtAppMainLoop' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppMainLoop'>
+<funcprototype>
+<funcdef>void <function>XtAppMainLoop</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtAppMainLoop' xrefstyle='select: title'/>
+function first reads the next incoming X event by calling
+<xref linkend='XtAppNextEvent' xrefstyle='select: title'/>
+and then dispatches the event to the appropriate registered procedure
+by calling
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>.
+This constitutes the main loop of X Toolkit applications.
+There is nothing special about
+<xref linkend='XtAppMainLoop' xrefstyle='select: title'/>;
+it simply calls
+<xref linkend='XtAppNextEvent' xrefstyle='select: title'/>
+and then
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>
+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
+<xref linkend='XtAppLock' xrefstyle='select: title'/>
+and
+<xref linkend='XtAppUnlock' xrefstyle='select: title'/>.
+</para>
+
+<para>
+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
+<xref linkend='XtAppNextEvent' xrefstyle='select: title'/>.
+</para>
+</sect1>
+
+<sect1 id="Setting_and_Checking_the_Sensitivity_State_of_a_Widget">
+<title>Setting and Checking the Sensitivity State of a Widget</title>
+<para>
+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>
+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>
+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.
+</para>
+
+<note>
+<para>
+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
+<xref linkend='XtSetSensitive' xrefstyle='select: title'/>
+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.
+</para>
+</note>
+
+<para>
+To set the sensitivity state of a widget, use
+<xref linkend='XtSetSensitive' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtSetSensitive'>
+<funcprototype>
+<funcdef>void <function>XtSetSensitive</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>Boolean <parameter>sensitive</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget.  Must be of class RectObj or any subclass thereof.
+      </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>
+The
+<xref linkend='XtSetSensitive' xrefstyle='select: title'/>
+function first calls
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+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,
+<xref linkend='XtSetSensitive' xrefstyle='select: title'/>
+recursively propagates the new value
+down the child tree by calling
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+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>,
+<xref linkend='XtSetSensitive' xrefstyle='select: title'/>
+sets the <emphasis remap='I'>ancestor_sensitive</emphasis> of each child to
+<function>True</function>
+and then recursively calls
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+on each normal descendant that is now sensitive to set
+<emphasis remap='I'>ancestor_sensitive</emphasis> to
+<function>True</function>.
+</para>
+
+<para>
+<xref linkend='XtSetSensitive' xrefstyle='select: title'/>
+calls
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+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>
+<xref linkend='XtSetSensitive' xrefstyle='select: title'/>
+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>.
+</para>
+
+<para>
+To check the current sensitivity state of a widget,
+use
+<xref linkend='XtIsSensitive' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtIsSensitive'>
+<funcprototype>
+<funcdef>Boolean <function>XtIsSensitive</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the object.  Must be of class Object or any subclass thereof.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtIsSensitive' xrefstyle='select: title'/>
+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>,
+<xref linkend='XtIsSensitive' xrefstyle='select: title'/>
+returns
+<function>True</function>;
+otherwise, it returns
+<function>False</function>.
+</para>
+</sect1>
+
+<sect1 id="Adding_Background_Work_Procedures">
+<title>Adding Background Work Procedures</title>
+<para>
+The Intrinsics 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
+<xref linkend='XtAppNextEvent' xrefstyle='select: title'/>
+or
+<xref linkend='XtAppProcessEvent' xrefstyle='select: title'/>.
+Work procedure pointers are of type
+<xref linkend='XtWorkProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtWorkProc'>
+<funcprototype>
+<funcdef>typedef Boolean <function>(*XtWorkProc)</function></funcdef>
+
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+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.
+</para>
+
+<para>
+To register a work procedure for a given application, use
+<xref linkend='XtAppAddWorkProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppAddWorkProc'>
+<funcprototype>
+<funcdef>XtWorkProcId <function>XtAppAddWorkProc</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+   <paramdef>XtWorkProc <parameter>proc</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtAppAddWorkProc' xrefstyle='select: title'/>
+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.
+</para>
+
+<para>
+To remove a work procedure, either return
+<function>True</function>
+from the procedure when it is called or use
+<xref linkend='XtRemoveWorkProc' xrefstyle='select: title'/>
+outside of the procedure.
+</para>
+
+<funcsynopsis id='XtRemoveWorkProc'>
+<funcprototype>
+<funcdef>void <function>XtRemoveWorkProc</function></funcdef>
+   <paramdef>XtWorkProcId <parameter>id</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>id</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies which work procedure to remove.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtRemoveWorkProc' xrefstyle='select: title'/>
+function explicitly removes the specified background work procedure.
+</para>
+</sect1>
+
+<sect1 id="X_Event_Filters">
+<title>X Event Filters</title>
+<para>
+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>
+<sect2 id="Pointer_Motion_Compression">
+<title>Pointer Motion Compression</title>
+<para>
+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>.
+When a request for an event would return a motion event,
+the Intrinsics 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>
+</sect2>
+
+<sect2 id="Enter_Leave_Compression">
+<title>Enter/Leave Compression</title>
+<para>
+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>.
+These enter and leave events are not delivered to the client
+if they are found together in the input queue.
+</para>
+</sect2>
+
+<sect2 id="Exposure_Compression">
+<title>Exposure Compression</title>
+<para>
+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>
+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:
+</para>
+
+<literallayout >
+#define XtExposeNoCompress     ((XtEnum)False)
+#define XtExposeCompressSeries ((XtEnum)True)
+#define XtExposeCompressMultiple       &lt;implementation-defined&gt;
+#define XtExposeCompressMaximal        &lt;implementation-defined&gt;
+</literallayout>
+
+<para>
+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>
+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
+<olink targetdoc='libX11' targetptr='Manipulating_Regions'>Section 16.5</olink> in
+<olink targetdoc='libX11' targetptr='libX11'>Xlib â€” C Language X Interface.</olink>.)
+</para>
+
+<para>
+The values have the following interpretation:
+</para>
+
+<para>
+<function>XtExposeNoCompress</function>
+</para>
+<itemizedlist spacing='compact'>
+  <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.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<function>XtExposeCompressSeries</function>
+</para>
+<itemizedlist spacing='compact'>
+  <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.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<function>XtExposeCompressMultiple</function>
+</para>
+<itemizedlist spacing='compact'>
+  <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.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<function>XtExposeCompressMaximal</function>
+</para>
+<itemizedlist spacing='compact'>
+  <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 Intrinsics will
+block until the end of the series is received.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+The additional flags have the following meaning:
+</para>
+
+<para>
+<function>XtExposeGraphicsExpose</function>
+</para>
+<itemizedlist spacing='compact'>
+  <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.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<function>XtExposeGraphicsExposeMerged</function>
+</para>
+<itemizedlist spacing='compact'>
+  <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>.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<function>XtExposeNoExpose</function>
+</para>
+<itemizedlist spacing='compact'>
+  <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.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<function>XtExposeNoRegion</function>
+</para>
+<itemizedlist spacing='compact'>
+  <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>
+</sect2>
+</sect1>
+
+<sect1 id="Widget_Exposure_and_Visibility">
+<title>Widget Exposure and Visibility</title>
+<para>
+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>
+
+<sect2 id="Redisplay_of_a_Widget_The_expose_Procedure">
+<title>Redisplay of a Widget: The expose Procedure</title>
+<para>
+The expose procedure pointer in a widget class is of type
+<xref linkend='XtExposeProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtExposeProc'>
+<funcprototype>
+<funcdef>typedef void <function>(*XtExposeProc)</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>XEvent *<parameter>event</parameter></paramdef>
+   <paramdef>Region <parameter>region</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+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.
+</para>
+
+<note>
+<para>
+If the <emphasis remap='I'>expose</emphasis> procedure is NULL,
+<xref linkend='XtRealizeWidget' xrefstyle='select: title'/>
+fills in a default bit gravity of
+<function>NorthWestGravity</function>
+before it calls the widget's realize procedure.
+</para>
+</note>
+
+<para>
+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 <xref linkend='Exposure_Compression' />),
+<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 Intrinsics, but
+the widget is permitted to modify the region contents.
+</para>
+
+<para>
+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>
+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>
+<literallayout >
+Boolean invert;
+Boolean highlight;
+Dimension highlight_width;
+</literallayout>
+<para>
+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 <xref linkend='Inheritance_of_Superclass_Operations' />.
+</para>
+</sect2>
+
+<sect2 id="Widget_Visibility">
+<title>Widget Visibility</title>
+<para>
+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>
+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>
+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>
+events and
+<function>False</function>
+on
+<function>VisibilityFullyObscured</function>
+events.
+</para>
+</sect2>
+</sect1>
+
+<sect1 id="X_Event_Handlers">
+<title>X Event Handlers</title>
+<para>
+Event handlers are procedures called when specified events
+occur in a widget.
+Most widgets need not use event handlers explicitly.
+Instead, they use the Intrinsics translation manager.
+Event handler procedure pointers are of the type
+<xref linkend='XtEventHandler' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtEventHandler'>
+<funcprototype>
+<funcdef>typedef void <function>(*XtEventHandler)</function></funcdef>
+
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+   <paramdef>XEvent *<parameter>event</parameter></paramdef>
+   <paramdef>Boolean *<parameter>continue_to_dispatch</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+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>
+The circumstances under which the Intrinsics 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>
+<sect2 id="Event_Handlers_That_Select_Events">
+<title>Event Handlers That Select Events</title>
+<para>
+To register an event handler procedure with the dispatch mechanism, use
+<xref linkend='XtAddEventHandler' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAddEventHandler'>
+<funcprototype>
+<funcdef>void <function>XtAddEventHandler</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>EventMask <parameter>event_mask</parameter></paramdef>
+   <paramdef>Boolean <parameter>nonmaskable</parameter></paramdef>
+   <paramdef>XtEventHandler <parameter>proc</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget for which this event handler is being registered.  Must be of class Core or any subclass thereof.
+      </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>
+The
+<xref linkend='XtAddEventHandler' xrefstyle='select: title'/>
+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,
+<xref linkend='XtAddEventHandler' xrefstyle='select: title'/>
+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.
+</para>
+
+<para>
+To remove a previously registered event handler, use
+<xref linkend='XtRemoveEventHandler' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtRemoveEventHandler'>
+<funcprototype>
+<funcdef>void <function>XtRemoveEventHandler</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>EventMask <parameter>event_mask</parameter></paramdef>
+   <paramdef>Boolean <parameter>nonmaskable</parameter></paramdef>
+   <paramdef>XtEventHandler <parameter>proc</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget for which this procedure is registered.  Must be of class Core or any subclass thereof.
+      </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>
+The
+<xref linkend='XtRemoveEventHandler' xrefstyle='select: title'/>
+function unregisters an event handler registered with
+<xref linkend='XtAddEventHandler' xrefstyle='select: title'/>
+or
+<xref linkend='XtInsertEventHandler' xrefstyle='select: title'/>
+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,
+<xref linkend='XtRemoveEventHandler' xrefstyle='select: title'/>
+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>,
+<xref linkend='XtRemoveEventHandler' xrefstyle='select: title'/>
+returns without reporting an error.
+</para>
+
+<para>
+To stop a procedure registered with
+<xref linkend='XtAddEventHandler' xrefstyle='select: title'/>
+or
+<xref linkend='XtInsertEventHandler' xrefstyle='select: title'/>
+from receiving all selected events, call
+<xref linkend='XtRemoveEventHandler' xrefstyle='select: title'/>
+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
+<xref linkend='XtAddRawEventHandler' xrefstyle='select: title'/>
+or
+<xref linkend='XtInsertRawEventHandler' xrefstyle='select: title'/>.
+</para>
+
+<para>
+To register an event handler procedure that receives events before or
+after all previously registered event handlers, use
+<xref linkend='XtInsertEventHandler' xrefstyle='select: title'/>.
+</para>
+<literallayout >
+typedef enum {XtListHead, XtListTail} XtListPosition;
+</literallayout>
+
+<funcsynopsis id='XtInsertEventHandler'>
+<funcprototype>
+<funcdef>void <function>XtInsertEventHandler</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>EventMask <parameter>event_mask</parameter></paramdef>
+   <paramdef>Boolean <parameter>nonmaskable</parameter></paramdef>
+   <paramdef>XtEventHandler <parameter>proc</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+   <paramdef>XtListPosition <parameter>position</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget for which this event handler is being registered. Must be of class Core or any subclass thereof.
+      </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>
+<xref linkend='XtInsertEventHandler' xrefstyle='select: title'/>
+is identical to
+<xref linkend='XtAddEventHandler' xrefstyle='select: title'/>
+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>
+</sect2>
+
+<sect2 id="Event_Handlers_That_Do_Not_Select_Events">
+<title>Event Handlers That Do Not Select Events</title>
+<para>
+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
+<xref linkend='XtAddRawEventHandler' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAddRawEventHandler'>
+<funcprototype>
+<funcdef>void <function>XtAddRawEventHandler</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>EventMask <parameter>event_mask</parameter></paramdef>
+   <paramdef>Boolean <parameter>nonmaskable</parameter></paramdef>
+   <paramdef>XtEventHandler <parameter>proc</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget for which this event handler is being registered. Must be of class Core or any subclass thereof.
+      </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>
+The
+<xref linkend='XtAddRawEventHandler' xrefstyle='select: title'/>
+function is similar to
+<xref linkend='XtAddEventHandler' xrefstyle='select: title'/>
+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.
+</para>
+
+<para>
+To remove a previously registered raw event handler, use
+<xref linkend='XtRemoveRawEventHandler' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtRemoveRawEventHandler'>
+<funcprototype>
+<funcdef>void <function>XtRemoveRawEventHandler</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>EventMask <parameter>event_mask</parameter></paramdef>
+   <paramdef>Boolean <parameter>nonmaskable</parameter></paramdef>
+   <paramdef>XtEventHandler <parameter>proc</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget for which this procedure is registered.  Must be of class Core or any subclass thereof.
+      </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>
+The
+<xref linkend='XtRemoveRawEventHandler' xrefstyle='select: title'/>
+function unregisters an event handler registered with
+<xref linkend='XtAddRawEventHandler' xrefstyle='select: title'/>
+or
+<xref linkend='XtInsertRawEventHandler' xrefstyle='select: title'/>
+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>,
+<xref linkend='XtRemoveRawEventHandler' xrefstyle='select: title'/>
+returns without reporting an error.
+</para>
+
+<para>
+To stop a procedure
+registered with
+<xref linkend='XtAddRawEventHandler' xrefstyle='select: title'/>
+or
+<xref linkend='XtInsertRawEventHandler' xrefstyle='select: title'/>
+from receiving all nonselected events, call
+<xref linkend='XtRemoveRawEventHandler' xrefstyle='select: title'/>
+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
+<xref linkend='XtAddEventHandler' xrefstyle='select: title'/>
+or
+<xref linkend='XtInsertEventHandler' xrefstyle='select: title'/>.
+</para>
+
+<para>
+To register an event handler procedure that receives events before or
+after all previously registered event handlers without selecting for
+the events, use
+<xref linkend='XtInsertRawEventHandler' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtInsertRawEventHandler'>
+<funcprototype>
+<funcdef>void <function>XtInsertRawEventHandler</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>EventMask <parameter>event_mask</parameter></paramdef>
+   <paramdef>Boolean <parameter>nonmaskable</parameter></paramdef>
+   <paramdef>XtEventHandler <parameter>proc</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+   <paramdef>XtListPosition <parameter>position</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget for which this event handler is being registered. Must be of class Core or any subclass thereof.
+      </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>
+The
+<xref linkend='XtInsertRawEventHandler' xrefstyle='select: title'/>
+function is similar to
+<xref linkend='XtInsertEventHandler' xrefstyle='select: title'/>
+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>
+</sect2>
+
+<sect2 id="Current_Event_Mask">
+<title>Current Event Mask</title>
+<para>
+To retrieve the event mask for a given widget, use
+<xref linkend='XtBuildEventMask' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtBuildEventMask'>
+<funcprototype>
+<funcdef>EventMask <function>XtBuildEventMask</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget.  Must be of class Core or any subclass thereof.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtBuildEventMask' xrefstyle='select: title'/>
+function returns the event mask representing the logical OR
+of all event masks for event handlers registered on the widget with
+<xref linkend='XtAddEventHandler' xrefstyle='select: title'/>
+and
+<xref linkend='XtInsertEventHandler' xrefstyle='select: title'/>
+and all event translations, including accelerators,
+installed on the widget.
+This is the same event mask stored into the
+<function>XSetWindowAttributes</function>
+structure by
+<xref linkend='XtRealizeWidget' xrefstyle='select: title'/>
+and sent to the server when event handlers and translations are installed or
+removed on the realized widget.
+</para>
+</sect2>
+
+<sect2 id="Event_Handlers_for_X_Protocol_Extensions">
+<title>Event Handlers for X11 Protocol Extensions</title>
+<para>
+To register an event handler procedure with the Intrinsics dispatch
+mechanism according to an event type, use
+<xref linkend='XtInsertEventTypeHandler' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtInsertEventTypeHandler'>
+<funcprototype>
+<funcdef>void <function>XtInsertEventTypeHandler</function></funcdef>
+   <paramdef>Widget <parameter>widget</parameter></paramdef>
+   <paramdef>int <parameter>event_type</parameter></paramdef>
+   <paramdef>XtPointer <parameter>select_data</parameter></paramdef>
+   <paramdef>XtEventHandler <parameter>proc</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+   <paramdef>XtListPosition <parameter>position</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>widget</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget for which this event handler is being registered.  Must be of class Core or any subclass thereof.
+      </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>
+<xref linkend='XtInsertEventTypeHandler' xrefstyle='select: title'/>
+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>
+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
+<xref linkend='XtBuildEventMask' xrefstyle='select: title'/>.
+If the widget is realized,
+<xref linkend='XtInsertEventTypeHandler' xrefstyle='select: title'/>
+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
+<xref linkend='XtInsertRawEventHandler' xrefstyle='select: title'/>
+function.
+</para>
+
+<para>
+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>
+In either case the Intrinsics 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>
+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>
+Each widget has a single registered event handler list, which will
+contain any procedure/client_data pair exactly once if it is
+registered with
+<xref linkend='XtInsertEventTypeHandler' xrefstyle='select: title'/>,
+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.
+</para>
+
+<para>
+To remove an event handler registered with
+<xref linkend='XtInsertEventTypeHandler' xrefstyle='select: title'/>,
+use
+<xref linkend='XtRemoveEventTypeHandler' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtRemoveEventTypeHandler'>
+<funcprototype>
+<funcdef>void <function>XtRemoveEventTypeHandler</function></funcdef>
+   <paramdef>Widget <parameter>widget</parameter></paramdef>
+   <paramdef>int <parameter>event_type</parameter></paramdef>
+   <paramdef>XtPointer <parameter>select_data</parameter></paramdef>
+   <paramdef>XtEventHandler <parameter>proc</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>widget</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget for which the event handler was registered.  Must be of class Core or any subclass thereof.
+      </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>
+The
+<xref linkend='XtRemoveEventTypeHandler' xrefstyle='select: title'/>
+function unregisters an event handler
+registered with
+<xref linkend='XtInsertEventTypeHandler' xrefstyle='select: title'/>
+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>
+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,
+<xref linkend='XtRemoveEventTypeHandler' xrefstyle='select: title'/>
+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
+<xref linkend='XtRemoveRawEventHandler' xrefstyle='select: title'/>
+function.
+</para>
+
+<para>
+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>
+To register a procedure to select extension events for a widget, use
+<xref linkend='XtRegisterExtensionSelector' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtRegisterExtensionSelector'>
+<funcprototype>
+<funcdef>void <function>XtRegisterExtensionSelector</function></funcdef>
+   <paramdef>Display <parameter>*display</parameter></paramdef>
+   <paramdef>int <parameter>min_event_type</parameter></paramdef>
+   <paramdef>int <parameter>max_event_type</parameter></paramdef>
+   <paramdef>XtExtensionSelectProc <parameter>proc</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtRegisterExtensionSelector' xrefstyle='select: title'/>
+function registers a procedure to arrange
+for the delivery of extension events to widgets.
+</para>
+
+<para>
+If <emphasis remap='I'>min_event_type</emphasis> and <emphasis remap='I'>max_event_type</emphasis> match the parameters
+to a previous call to
+<xref linkend='XtRegisterExtensionSelector' xrefstyle='select: title'/>
+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>
+When a widget is realized,
+after the <emphasis remap='I'>core.realize</emphasis> method is called,
+the Intrinsics check to see if any event
+handler specifies an event type within the range of a registered
+extension selector.  If so, the Intrinsics call each such selector.
+If an event type handler is added or removed, the Intrinsics 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 Intrinsics
+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.
+</para>
+
+<para>
+An extension selector is of type
+<xref linkend='XtExtensionSelectProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtExtensionSelectProc'>
+<funcprototype>
+<funcdef>typedef void <function>(*XtExtensionSelectProc)</function></funcdef>
+
+   <paramdef>Widget <parameter>widget</parameter></paramdef>
+   <paramdef>int *<parameter>event_types</parameter></paramdef>
+   <paramdef>XtPointer *<parameter>select_data</parameter></paramdef>
+   <paramdef>int <parameter>count</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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
+<xref linkend='XtInsertEventTypeHandler' xrefstyle='select: title'/>.
+      </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>
+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
+<xref linkend='XtInsertEventTypeHandler' xrefstyle='select: title'/>.
+</para>
+
+<para>
+To register a procedure to dispatch events of a specific type within
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>,
+use
+<xref linkend='XtSetEventDispatcher' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtSetEventDispatcher'>
+<funcprototype>
+<funcdef>XtEventDispatchProc <function>XtSetEventDispatcher</function></funcdef>
+   <paramdef>Display *<parameter>display</parameter></paramdef>
+   <paramdef>int <parameter>event_type</parameter></paramdef>
+   <paramdef>XtEventDispatchProc <parameter>proc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtSetEventDispatcher' xrefstyle='select: title'/>
+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>
+In the future, when
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>
+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>
+The default dispatcher handles the Intrinsics 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.
+</para>
+
+<para>
+An event dispatcher procedure pointer is of type
+<xref linkend='XtEventDispatchProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtEventDispatchProc'>
+<funcprototype>
+<funcdef>typedef Boolean <function>(*XtEventDispatchProc)</function></funcdef>
+   <paramdef>XEvent *<parameter>event</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event</emphasis>
+    </term>
+    <listitem>
+      <para>
+Passes the event to be dispatched.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The event dispatcher procedure should determine whether this event is of
+a type that should be dispatched to a widget.
+</para>
+
+<para>
+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
+<xref linkend='XtDispatchEventToWidget' xrefstyle='select: title'/>.
+The procedure should return
+<function>True</function>
+if either
+<function>XFilterEvent</function>
+or
+<xref linkend='XtDispatchEventToWidget' xrefstyle='select: title'/>
+returned
+<function>True</function>
+and
+<function>False</function>
+otherwise.
+</para>
+
+<para>
+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.
+</para>
+
+<para>
+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
+<xref linkend='XtGetKeyboardFocusWidget' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtGetKeyboardFocusWidget'>
+<funcprototype>
+<funcdef>Widget <function>XtGetKeyboardFocusWidget</function></funcdef>
+   <paramdef>Widget <parameter>widget</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>widget</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget to get forwarding information for.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtGetKeyboardFocusWidget' xrefstyle='select: title'/>
+function returns the widget that would be the end result of keyboard
+event forwarding for a keyboard event for the specified widget.
+</para>
+
+<para>
+To dispatch an event to a specified widget, use
+<xref linkend='XtDispatchEventToWidget' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtDispatchEventToWidget'>
+<funcprototype>
+<funcdef>Boolean <function>XtDispatchEventToWidget</function></funcdef>
+   <paramdef>Widget <parameter>widget</parameter></paramdef>
+   <paramdef>XEvent *<parameter>event</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtDispatchEventToWidget' xrefstyle='select: title'/>
+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 Intrinsics 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>
+<xref linkend='XtDispatchEventToWidget' xrefstyle='select: title'/>
+returns
+<function>True</function>
+if any event handler was called and
+<function>False</function>
+otherwise.
+</para>
+</sect2>
+</sect1>
+
+<sect1 id="Using_the_Intrinsics_in_a_Multi_Threaded_Environment">
+<title>Using the Intrinsics in a Multi-Threaded Environment</title>
+<para>
+The Intrinsics may be used in environments that offer multiple threads
+of execution within the context of a single process.  A multi-threaded
+application using the Intrinsics must explicitly initialize the toolkit
+for mutually exclusive access by calling
+<xref linkend='XtToolkitThreadInitialize' xrefstyle='select: title'/>.
+</para>
+<sect2 id="Initializing_a_Multi_Threaded_Intrinsics_Application">
+<title>Initializing a Multi-Threaded Intrinsics Application</title>
+<para>
+To test and initialize Intrinsics support for mutually exclusive thread
+access, call
+<xref linkend='XtToolkitThreadInitialize' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtToolkitThreadInitialize'>
+<funcprototype>
+<funcdef>Boolean <function>XtToolkitThreadInitialize</function></funcdef>
+   <paramdef><parameter></parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+<xref linkend='XtToolkitThreadInitialize' xrefstyle='select: title'/>
+returns <function>True</function> if the Intrinsics support mutually exclusive thread
+access, otherwise it returns <function>False</function>. <xref linkend='XtToolkitThreadInitialize' xrefstyle='select: title'/>
+must be called before
+<xref linkend='XtCreateApplicationContext' xrefstyle='select: title'/>,
+<xref linkend='XtAppInitialize' xrefstyle='select: title'/>,
+<xref linkend='XtOpenApplication' xrefstyle='select: title'/>,
+or
+<function>XtSetLanguageProc</function>
+is called. <xref linkend='XtToolkitThreadInitialize' xrefstyle='select: title'/> may be called more than once;
+however, the application writer must ensure that it is not called
+simultaneously by two or more threads.
+</para>
+</sect2>
+
+<sect2 id="Locking_tk_Data_Structures">
+<title>Locking X Toolkit Data Structures</title>
+<para>
+The Intrinsics 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 Intrinsics process
+global data.
+</para>
+
+<para>
+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>
+Most application writers will have little need to use locking as the
+Intrinsics 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>
+<literallayout >
+       ...
+       XtAppLock(app_context);
+       XtCvtStringToPixel(dpy, args, num_args, fromVal, toVal, closure_ret);
+       XtAppUnlock(app_context);
+       ...
+</literallayout>
+<para>
+When the application relies upon
+<xref linkend='XtConvertAndStore' xrefstyle='select: title'/>
+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>
+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>
+<literallayout >
+#include &lt;X11/CoreP.h&gt;
+Boolean BeingDestroyed (widget)
+       Widget widget;
+{
+       Boolean ret;
+       XtAppLock(XtWidgetToApplicationContext(widget));
+       ret = widget-&gt;core.being_destroyed;
+       XtAppUnlock(XtWidgetToApplicationContext(widget));
+       return ret;
+}
+</literallayout>
+<para>
+A client that wishes to atomically call two or more Intrinsics functions
+must lock the application context.  For example:
+</para>
+<literallayout >
+       ...
+       XtAppLock(XtWidgetToApplicationContext(widget));
+       XtUnmanageChild (widget1);
+       XtManageChild (widget2);
+       XtAppUnlock(XtWidgetToApplicationContext(widget));
+       ...
+</literallayout>
+<sect3 id="Locking_the_Application_Context">
+<title>Locking the Application Context</title>
+<para>
+To ensure mutual exclusion of application context, display, or
+widget internal state, use
+<function>XtAppLock.</function>
+</para>
+
+<funcsynopsis id='XtAppLock'>
+<funcprototype>
+<funcdef>void <function>XtAppLock</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>app_context</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the application context to lock.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<xref linkend='XtAppLock' xrefstyle='select: title'/> 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>
+To unlock a locked application context, use
+<function>XtAppUnlock.</function>
+</para>
+
+<funcsynopsis id='XtAppUnlock'>
+<funcprototype>
+<funcdef>void <function>XtAppUnlock</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>app_context</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the application context that was previously locked.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+
+</sect3>
+<sect3 id="Locking_the_Process">
+<title>Locking the Process</title>
+<para>
+To ensure mutual exclusion of X Toolkit process global data, a
+widget writer must use
+<function>XtProcessLock.</function>
+</para>
+
+<funcsynopsis id='XtProcessLock'>
+<funcprototype>
+<funcdef>void <function>XtProcessLock</function></funcdef>
+   <paramdef><parameter></parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+<xref linkend='XtProcessLock' xrefstyle='select: title'/> 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>
+To unlock a locked process, use
+<xref linkend='XtProcessUnlock' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtProcessUnlock'>
+<funcprototype>
+<funcdef>void <function>XtProcessUnlock</function></funcdef>
+   <paramdef><parameter></parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+To lock both an application context and the process at the same
+time, call
+<xref linkend='XtAppLock' xrefstyle='select: title'/>
+first and then
+<xref linkend='XtProcessLock' xrefstyle='select: title'/>.
+To release both locks, call
+<xref linkend='XtProcessUnlock' xrefstyle='select: title'/>
+first and then
+<xref linkend='XtAppUnlock' xrefstyle='select: title'/>.
+The order is important to avoid deadlock.
+</para>
+</sect3>
+</sect2>
+
+<sect2 id="Event_Management_in_a_Multi_Threaded_Environment">
+<title>Event Management in a Multi-Threaded Environment</title>
+<para>
+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>
+To indicate that the event loop should terminate after the current
+event dispatch has completed, use
+<xref linkend='XtAppSetExitFlag' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppSetExitFlag'>
+<funcprototype>
+<funcdef>void <function>XtAppSetExitFlag</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>app_context</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the application context.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<xref linkend='XtAppMainLoop' xrefstyle='select: title'/>
+tests the value of the flag and will return if the flag is <function>True</function>.
+</para>
+
+<para>
+Application writers who implement their own main loop may test the
+value of the exit flag with
+<xref linkend='XtAppGetExitFlag' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppGetExitFlag'>
+<funcprototype>
+<funcdef>Boolean <function>XtAppGetExitFlag</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>app_context</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the application context.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<xref linkend='XtAppGetExitFlag' xrefstyle='select: title'/>
+will normally return <function>False</function>, indicating that event processing
+may continue.  When
+<xref linkend='XtAppGetExitFlag' xrefstyle='select: title'/>
+returns <function>True</function>, the loop must terminate and return to the caller,
+which might then destroy the application context.
+</para>
+
+<para>
+Application writers should be aware that, if a thread is blocked in
+<xref linkend='XtAppNextEvent' xrefstyle='select: title'/>,
+<xref linkend='XtAppPeekEvent' xrefstyle='select: title'/>,
+or
+<xref linkend='XtAppProcessEvent' xrefstyle='select: title'/>
+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>
+The Intrinsics manage access to events on a last-in, first-out basis.  If
+multiple threads in the same application context block in
+<xref linkend='XtAppNextEvent' xrefstyle='select: title'/>,
+<xref linkend='XtAppPeekEvent' xrefstyle='select: title'/>,
+or
+<xref linkend='XtAppProcessEvent' xrefstyle='select: title'/>,
+the last thread to call one of these functions is the first
+thread to return.
+</para>
+</sect2>
+</sect1>
+</chapter>
diff --git a/specs/CH08.xml b/specs/CH08.xml
new file mode 100644 (file)
index 0000000..2f24e65
--- /dev/null
@@ -0,0 +1,613 @@
+<chapter id='Callbacks'>
+<title>Callbacks</title>
+<para>
+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>
+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>
+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>
+<sect1 id="Using_Callback_Procedure_and_Callback_List_Definitions">
+<title>Using Callback Procedure and Callback List Definitions</title>
+<para>
+Callback procedure pointers for use in callback lists are of type
+<xref linkend='XtCallbackProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtCallbackProc'>
+<funcprototype>
+<funcdef>typedef void <function>(*XtCallbackProc)</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+   <paramdef>XtPointer <parameter>call_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+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
+<xref linkend='XtGetValues' xrefstyle='select: title'/>
+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>
+Whenever a client wants to pass a callback list as an argument in an
+<xref linkend='XtCreateWidget' xrefstyle='select: title'/>,
+<xref linkend='XtSetValues' xrefstyle='select: title'/>,
+or
+<xref linkend='XtGetValues' xrefstyle='select: title'/>
+call, it should specify the address
+of a NULL-terminated array of type
+<function>XtCallbackList</function>.
+</para>
+<literallayout >
+typedef struct {
+       XtCallbackProc callback;
+       XtPointer closure;
+} XtCallbackRec, *XtCallbackList;
+</literallayout>
+<para>
+For example, the callback list for procedures A and B with client data
+clientDataA and clientDataB, respectively, is
+</para>
+<literallayout >
+static XtCallbackRec callbacks[] = {
+       {A, (XtPointer) clientDataA},
+       {B, (XtPointer) clientDataB},
+       {(XtCallbackProc) NULL, (XtPointer) NULL}
+};
+</literallayout>
+<para>
+Although callback lists are passed by address in arglists
+and varargs lists,
+the Intrinsics 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 Intrinsics automatically do this,
+potentially using a different structure for their
+internal representation.
+</para>
+</sect1>
+
+<sect1 id="Identifying_Callback_Lists">
+<title>Identifying Callback Lists</title>
+<para>
+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
+<xref linkend='XtCallCallbackList' xrefstyle='select: title'/>
+check
+to see that the requested callback list is indeed implemented by the widget.
+</para>
+
+<para>
+For the Intrinsics 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 Intrinsics procedures.
+</para>
+</sect1>
+
+<sect1 id="Adding_Callback_Procedures">
+<title>Adding Callback Procedures</title>
+<para>
+To add a callback procedure to a widget's callback list, use
+<xref linkend='XtAddCallback' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAddCallback'>
+<funcprototype>
+<funcdef>void <function>XtAddCallback</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>String <parameter>callback_name</parameter></paramdef>
+   <paramdef>XtCallbackProc <parameter>callback</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget.  Must be of class Object or any subclass thereof.
+      </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>
+A callback will be invoked as many times as it occurs in the callback list.
+</para>
+
+<para>
+To add a list of callback procedures to a given widget's callback list, use
+<xref linkend='XtAddCallbacks' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAddCallbacks'>
+<funcprototype>
+<funcdef>void <function>XtAddCallbacks</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>String <parameter>callback_name</parameter></paramdef>
+   <paramdef>XtCallbackList <parameter>callbacks</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget.  Must be of class Object or any subclass thereof.
+      </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>
+
+
+</sect1>
+
+<sect1 id="Removing_Callback_Procedures">
+<title>Removing Callback Procedures</title>
+<para>
+To delete a callback procedure from a widget's callback list, use
+<xref linkend='XtRemoveCallback' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtRemoveCallback'>
+<funcprototype>
+<funcdef>void <function>XtRemoveCallback</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>String <parameter>callback_name</parameter></paramdef>
+   <paramdef>XtCallbackProc <parameter>callback</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget.  Must be of class Object or any subclass thereof.
+      </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>
+The
+<xref linkend='XtRemoveCallback' xrefstyle='select: title'/>
+function removes a callback only if both the procedure and the client
+data match.
+</para>
+
+<para>
+To delete a list of callback procedures from a given widget's callback list, use
+<xref linkend='XtRemoveCallbacks' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtRemoveCallbacks'>
+<funcprototype>
+<funcdef>void <function>XtRemoveCallbacks</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>String <parameter>callback_name</parameter></paramdef>
+   <paramdef>XtCallbackList <parameter>callbacks</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget.  Must be of class Object or any subclass thereof.
+      </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>
+To delete all callback procedures from a given widget's callback list
+and free all storage associated with the callback list, use
+<xref linkend='XtRemoveAllCallbacks' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtRemoveAllCallbacks'>
+<funcprototype>
+<funcdef>void <function>XtRemoveAllCallbacks</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>String <parameter>callback_name</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget.  Must be of class Object or any subclass thereof.
+      </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>
+
+
+</sect1>
+
+<sect1 id="Executing_Callback_Procedures">
+<title>Executing Callback Procedures</title>
+<para>
+To execute the procedures in a given widget's callback list,
+specifying the callback list by resource name, use
+<xref linkend='XtCallCallbacks' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtCallCallbacks'>
+<funcprototype>
+<funcdef>void <function>XtCallCallbacks</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>String <parameter>callback_name</parameter></paramdef>
+   <paramdef>XtPointer <parameter>call_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget.  Must be of class Object or any subclass thereof.
+      </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>
+<xref linkend='XtCallCallbacks' xrefstyle='select: title'/>
+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>.
+</para>
+
+<para>
+To execute the procedures in a callback list, specifying the callback
+list by address, use
+<xref linkend='XtCallCallbackList' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtCallCallbackList'>
+<funcprototype>
+<funcdef>void <function>XtCallCallbackList</function></funcdef>
+   <paramdef>Widget <parameter>widget</parameter></paramdef>
+   <paramdef>XtCallbackList <parameter>callbacks</parameter></paramdef>
+   <paramdef>XtPointer <parameter>call_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>widget</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget instance that contains the callback list.  Must be of class Object or any subclass thereof.
+      </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>
+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,
+<xref linkend='XtCallCallbackList' xrefstyle='select: title'/>
+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>
+</sect1>
+
+<sect1 id="Checking_the_Status_of_a_Callback_List">
+<title>Checking the Status of a Callback List</title>
+<para>
+To find out the status of a given widget's callback list, use
+<xref linkend='XtHasCallbacks' xrefstyle='select: title'/>.
+</para>
+
+<para>
+typedef enum {XtCallbackNoList, XtCallbackHasNone, XtCallbackHasSome} XtCallbackStatus;
+</para>
+
+<funcsynopsis id='XtHasCallbacks'>
+<funcprototype>
+<funcdef>XtCallbackStatus <function>XtHasCallbacks</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>String <parameter>callback_name</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget.  Must be of class Object or any subclass thereof.
+      </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>
+The
+<xref linkend='XtHasCallbacks' xrefstyle='select: title'/>
+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,
+<xref linkend='XtHasCallbacks' xrefstyle='select: title'/>
+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>.
+</para>
+</sect1>
+</chapter>
diff --git a/specs/CH09.xml b/specs/CH09.xml
new file mode 100644 (file)
index 0000000..1f64de5
--- /dev/null
@@ -0,0 +1,4326 @@
+<chapter id='Resource_Management'>
+<title>Resource Management</title>
+<para>
+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
+<xref linkend='XtCreateWidget' xrefstyle='select: title'/>
+(by naming the field in the argument list), by an
+entry in a resource file (by using either the name or class), and by
+<xref linkend='XtSetValues' xrefstyle='select: title'/>.
+In addition, it is readable by
+<xref linkend='XtGetValues' xrefstyle='select: title'/>.
+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>
+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
+<xref linkend='XtCreateWidget' xrefstyle='select: title'/>,
+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>
+<sect1 id="Resource_Lists">
+<title>Resource Lists</title>
+<para>
+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>
+<literallayout >
+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>
+<para>
+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>
+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 Intrinsics 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 Intrinsics are named in
+<function>&lt;X11/StringDefs.h&gt;</function>.
+The Intrinsics's symbolic resource names begin with
+``XtN''
+and are followed by the string name (for example, XtNbackgroundPixel
+for backgroundPixel).
+</para>
+
+<para>
+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 spacing='compact'>
+  <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>
+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>
+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>
+<literallayout >
+*Background:   ivory
+*Foreground:   darkblue
+</literallayout>
+<para>
+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>
+<literallayout >
+*Font: 6x13
+</literallayout>
+<para>
+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>
+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 <xref linkend='Resource_Conversions' />).
+The Intrinsics define the following resource types:
+</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Resource Type</entry>
+      <entry>Structure or Field Type</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry><function>XtRAcceleratorTable</function></entry>
+      <entry>XtAccelerators</entry>
+    </row>
+    <row>
+      <entry><function>XtRAtom</function></entry>
+      <entry>Atom</entry>
+    </row>
+    <row>
+      <entry><function>XtRBitmap</function></entry>
+      <entry>Pixmap, depth=1</entry>
+    </row>
+    <row>
+      <entry><function>XtRBoolean</function></entry>
+      <entry>Boolean</entry>
+    </row>
+    <row>
+      <entry><function>XtRBool</function></entry>
+      <entry>Bool</entry>
+    </row>
+    <row>
+      <entry><function>XtRCallback</function></entry>
+      <entry>XtCallbackList</entry>
+    </row>
+    <row>
+      <entry><function>XtRCardinal</function></entry>
+      <entry>Cardinal</entry>
+    </row>
+    <row>
+      <entry><function>XtRColor</function></entry>
+      <entry>XColor</entry>
+    </row>
+    <row>
+      <entry><function>XtRColormap</function></entry>
+      <entry>Colormap</entry>
+    </row>
+    <row>
+      <entry><function>XtRCommandArgArray</function></entry>
+      <entry>String*</entry>
+    </row>
+    <row>
+      <entry><function>XtRCursor</function></entry>
+      <entry>Cursor</entry>
+    </row>
+    <row>
+      <entry><function>XtRDimension</function></entry>
+      <entry>Dimension</entry>
+    </row>
+    <row>
+      <entry><function>XtRDirectoryString</function></entry>
+      <entry>String</entry>
+    </row>
+    <row>
+      <entry><function>XtRDisplay</function></entry>
+      <entry>Display*</entry>
+    </row>
+    <row>
+      <entry><function>XtREnum</function></entry>
+      <entry>XtEnum</entry>
+    </row>
+    <row>
+      <entry><function>XtREnvironmentArray</function></entry>
+      <entry>String*</entry>
+    </row>
+    <row>
+      <entry><function>XtRFile</function></entry>
+      <entry>FILE*</entry>
+    </row>
+    <row>
+      <entry><function>XtRFloat</function></entry>
+      <entry>float</entry>
+    </row>
+    <row>
+      <entry><function>XtRFont</function></entry>
+      <entry>Font</entry>
+    </row>
+    <row>
+      <entry><function>XtRFontSet</function></entry>
+      <entry>XFontSet</entry>
+    </row>
+    <row>
+      <entry><function>XtRFontStruct</function></entry>
+      <entry>XFontStruct*</entry>
+    </row>
+    <row>
+      <entry><function>XtRFunction</function></entry>
+      <entry>(*)()</entry>
+    </row>
+    <row>
+      <entry><function>XtRGeometry</function></entry>
+      <entry>char*, format as defined by
+      <function>XParseGeometry</function></entry>
+    </row>
+    <row>
+      <entry><function>XtRGravity</function></entry>
+      <entry>int</entry>
+    </row>
+    <row>
+      <entry><function>XtRInitialState</function></entry>
+      <entry>int</entry>
+    </row>
+    <row>
+      <entry><function>XtRInt</function></entry>
+      <entry>int</entry>
+    </row>
+    <row>
+      <entry><function>XtRLongBoolean</function></entry>
+      <entry>long</entry>
+    </row>
+    <row>
+      <entry><function>XtRObject</function></entry>
+      <entry>Object</entry>
+    </row>
+    <row>
+      <entry><function>XtRPixel</function></entry>
+      <entry>Pixel</entry>
+    </row>
+    <row>
+      <entry><function>XtRPixmap</function></entry>
+      <entry>Pixmap</entry>
+    </row>
+    <row>
+      <entry><function>XtRPointer</function></entry>
+      <entry>XtPointer</entry>
+    </row>
+    <row>
+      <entry><function>XtRPosition</function></entry>
+      <entry>Position</entry>
+    </row>
+    <row>
+      <entry><function>XtRRestartStyle</function></entry>
+      <entry>unsigned char</entry>
+    </row>
+    <row>
+      <entry><function>XtRScreen</function></entry>
+      <entry>Screen*</entry>
+    </row>
+    <row>
+      <entry><function>XtRShort</function></entry>
+      <entry>short</entry>
+    </row>
+    <row>
+      <entry><function>XtRSmcConn</function></entry>
+      <entry>XtPointer</entry>
+    </row>
+    <row>
+      <entry><function>XtRString</function></entry>
+      <entry>String</entry>
+    </row>
+    <row>
+      <entry><function>XtRStringArray</function></entry>
+      <entry>String*</entry>
+    </row>
+    <row>
+      <entry><function>XtRStringTable</function></entry>
+      <entry>String*</entry>
+    </row>
+    <row>
+      <entry><function>XtRTranslationTable</function></entry>
+      <entry>XtTranslations</entry>
+    </row>
+    <row>
+      <entry><function>XtRUnsignedChar</function></entry>
+      <entry>unsigned char</entry>
+    </row>
+    <row>
+      <entry><function>XtRVisual</function></entry>
+      <entry>Visual*</entry>
+    </row>
+    <row>
+      <entry><function>XtRWidget</function></entry>
+      <entry>Widget</entry>
+    </row>
+    <row>
+      <entry><function>XtRWidgetClass</function></entry>
+      <entry>WidgetClass</entry>
+    </row>
+    <row>
+      <entry><function>XtRWidgetList</function></entry>
+      <entry>WidgetList</entry>
+    </row>
+    <row>
+      <entry><function>XtRWindow</function></entry>
+      <entry>Window</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+<function>&lt;X11/StringDefs.h&gt;</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>
+The <emphasis remap='I'>resource_size</emphasis> field is the size of the physical representation in bytes;
+you should specify it as
+<function>sizeof</function>(type) 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
+<xref linkend='XtOffsetOf' xrefstyle='select: title'/>
+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>
+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
+<xref linkend='XtResourceDefaultProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtResourceDefaultProc'>
+<funcprototype>
+<funcdef>typedef void <function>(*XtResourceDefaultProc)</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>int <parameter>offset</parameter></paramdef>
+   <paramdef>XrmValue *<parameter>value</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtResourceDefaultProc' xrefstyle='select: title'/>
+procedure should fill in the <emphasis remap='I'>value-&gt;addr</emphasis> field with a pointer
+to the resource value in its correct representation type.
+</para>
+
+<para>
+To get the resource list structure for a particular class, use
+<xref linkend='XtGetResourceList' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtGetResourceList'>
+<funcprototype>
+<funcdef>void <function>XtGetResourceList</function></funcdef>
+
+   <paramdef>WidgetClass <parameter>class</parameter></paramdef>
+   <paramdef>XtResourceList *<parameter>resources_return</parameter></paramdef>
+   <paramdef>Cardinal *<parameter>num_resources_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+If
+<xref linkend='XtGetResourceList' xrefstyle='select: title'/>
+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,
+<xref linkend='XtGetResourceList' xrefstyle='select: title'/>
+returns a merged resource list that includes the resources
+for all superclasses.
+The list returned by
+<xref linkend='XtGetResourceList' xrefstyle='select: title'/>
+should be freed using
+<xref linkend='XtFree' xrefstyle='select: title'/>
+when it is no longer needed.
+</para>
+
+<para>
+To get the constraint resource list structure for a particular widget
+class, use
+<xref linkend='XtGetConstraintResourceList' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtGetConstraintResourceList'>
+<funcprototype>
+<funcdef>void <function>XtGetConstraintResourceList</function></funcdef>
+   <paramdef>WidgetClass <parameter>class</parameter></paramdef>
+   <paramdef>XtResourceList *<parameter>resources_return</parameter></paramdef>
+   <paramdef>Cardinal *<parameter>num_resources_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+If
+<xref linkend='XtGetConstraintResourceList' xrefstyle='select: title'/>
+is called before the widget class is
+initialized, the resource list as specified in the widget
+class Constraint part is returned.  If
+<xref linkend='XtGetConstraintResourceList' xrefstyle='select: title'/>
+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
+<xref linkend='XtGetConstraintResourceList' xrefstyle='select: title'/>
+should be freed using
+<xref linkend='XtFree' xrefstyle='select: title'/>
+when it is no longer needed.
+</para>
+
+<para>
+The routines
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+and
+<xref linkend='XtGetValues' xrefstyle='select: title'/>
+also use the resource list to set and get widget state;
+see <xref linkend='Obtaining_Widget_State' /> and
+<xref linkend='Setting_Widget_State' />.
+</para>
+
+<para>
+Here is an abbreviated version of a possible resource list for a Label widget:
+</para>
+<literallayout >
+/* 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>
+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>
+</sect1>
+
+<sect1 id="Byte_Offset_Calculations">
+<title>Byte Offset Calculations</title>
+<para>
+To determine the byte offset of a field within a structure type, use
+<xref linkend='XtOffsetOf' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtOffsetOf'>
+<funcprototype>
+<funcdef>Cardinal <function>XtOffsetOf</function></funcdef>
+      <paramdef>Type <parameter>structure_type</parameter></paramdef>
+      <paramdef>Field <parameter>field_name</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+
+
+<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>
+The
+<xref linkend='XtOffsetOf' xrefstyle='select: title'/>
+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
+<xref linkend='XtOffset' xrefstyle='select: title'/>,
+which serves the same function.
+</para>
+
+<para>
+To determine the byte offset of a field within a structure pointer type, use
+<xref linkend='XtOffset' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtOffset'>
+<funcprototype>
+<funcdef>Cardinal <function>XtOffset</function></funcdef>
+      <paramdef>Type <parameter> pointer_type</parameter></paramdef>
+      <paramdef>Field <parameter> field_name</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtOffset' xrefstyle='select: title'/>
+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.
+<xref linkend='XtOffset' xrefstyle='select: title'/>
+is less portable than
+<xref linkend='XtOffsetOf' xrefstyle='select: title'/>.
+</para>
+</sect1>
+
+<sect1 id="Superclass_to_Subclass_Chaining_of_Resource_Lists">
+<title>Superclass-to-Subclass Chaining of Resource Lists</title>
+<para>
+The
+<xref linkend='XtCreateWidget' xrefstyle='select: title'/>
+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>
+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>
+Also at class initialization time, the Intrinsics produce an
+internal representation of the resource list to optimize access time
+when creating widgets.  In order to save memory, the Intrinsics 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>
+</sect1>
+
+<sect1 id="Subresources">
+<title>Subresources</title>
+<para>
+A widget does not do anything to retrieve its own resources;
+instead,
+<xref linkend='XtCreateWidget' xrefstyle='select: title'/>
+does this automatically before calling the class initialize procedure.
+</para>
+
+<para>
+Some widgets have subparts that are not widgets but for which the widget
+would like to fetch resources.
+Such widgets call
+<xref linkend='XtGetSubresources' xrefstyle='select: title'/>
+to accomplish this.
+</para>
+
+<funcsynopsis id='XtGetSubresources'>
+<funcprototype>
+<funcdef>void <function>XtGetSubresources</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>XtPointer <parameter>base</parameter></paramdef>
+   <paramdef>String <parameter>name</parameter></paramdef>
+   <paramdef>String <parameter>class</parameter></paramdef>
+   <paramdef>XtResourceList <parameter>resources</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_resources</parameter></paramdef>
+   <paramdef>ArgList <parameter>args</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_args</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the object used to qualify the subpart resource name and
+class.  Must be of class Object or any subclass thereof.
+      </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>
+The
+<xref linkend='XtGetSubresources' xrefstyle='select: title'/>
+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>
+<xref linkend='XtGetSubresources' xrefstyle='select: title'/>
+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
+<xref linkend='XtGetSubresources' xrefstyle='select: title'/>
+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.
+</para>
+
+<para>
+To fetch resources for widget subparts using varargs lists, use
+<xref linkend='XtVaGetSubresources' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtVaGetSubresources'>
+<funcprototype>
+<funcdef>void <function>XtVaGetSubresources</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>XtPointer <parameter>base</parameter></paramdef>
+   <paramdef>String <parameter>name</parameter></paramdef>
+   <paramdef>String <parameter>class</parameter></paramdef>
+   <paramdef>XtResourceList <parameter>resources</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_resources</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the object used to qualify the subpart resource name and
+class.  Must be of class Object or any subclass thereof.
+      </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>
+<xref linkend='XtVaGetSubresources' xrefstyle='select: title'/>
+is identical in function to
+<xref linkend='XtGetSubresources' xrefstyle='select: title'/>
+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>
+</sect1>
+
+<sect1 id="Obtaining_Application_Resources">
+<title>Obtaining Application Resources</title>
+<para>
+To retrieve resources that are not specific to a widget
+but apply to the overall application, use
+<xref linkend='XtGetApplicationResources' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtGetApplicationResources'>
+<funcprototype>
+<funcdef>void <function>XtGetApplicationResources</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>XtPointer <parameter>base</parameter></paramdef>
+   <paramdef>XtResourceList <parameter>resources</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_resources</parameter></paramdef>
+   <paramdef>ArgList <parameter>args</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_args</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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).  Must be of class Object or any subclass thereof.
+      </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>
+The
+<xref linkend='XtGetApplicationResources' xrefstyle='select: title'/>
+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,
+<xref linkend='XtGetApplicationResources' xrefstyle='select: title'/>
+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>
+<xref linkend='XtGetApplicationResources' xrefstyle='select: title'/>
+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
+<xref linkend='XtGetApplicationResources' xrefstyle='select: title'/>
+will not be freed from the resource cache until the display is closed.
+</para>
+
+<para>
+To retrieve resources for the overall application using varargs lists, use
+<xref linkend='XtVaGetApplicationResources' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtVaGetApplicationResources'>
+<funcprototype>
+<funcdef>void <function>XtVaGetApplicationResources</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>XtPointer <parameter>base</parameter></paramdef>
+   <paramdef>XtResourceList <parameter>resources</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_resources</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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).  Must be of class Object or any subclass thereof.
+      </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>
+<xref linkend='XtVaGetApplicationResources' xrefstyle='select: title'/>
+is identical in function to
+<xref linkend='XtGetApplicationResources' xrefstyle='select: title'/>
+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>
+</sect1>
+
+<sect1 id="Resource_Conversions">
+<title>Resource Conversions</title>
+<para>
+The Intrinsics provide a mechanism for registering representation converters that
+are automatically invoked by the resource-fetching routines.
+The Intrinsics additionally provide and register several commonly used converters.
+This resource conversion mechanism serves several purposes:
+</para>
+<itemizedlist spacing='compact'>
+  <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>
+<sect2 id="Predefined_Resource_Converters">
+<title>Predefined Resource Converters</title>
+<para>
+The Intrinsics define all the representations used in the
+Object,
+RectObj,
+Core,
+Composite,
+Constraint,
+and
+Shell
+widget classes.
+The Intrinsics register the following resource converters that accept
+input values of representation type
+<function>XtRString</function>.
+</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='3' align='left' rowsep='0' colsep='0'>
+  <colspec colwidth='0.7*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <colspec colwidth='0.6*' colname='c3'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Target Representation</entry>
+      <entry>Converter Name</entry>
+      <entry>Additional Args</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry><function>XtRAcceleratorTable</function></entry>
+      <entry><function>XtCvtStringToAcceleratorTable</function></entry>
+    </row>
+    <row>
+      <entry><function>XtRAtom</function></entry>
+      <entry><function>XtCvtStringToAtom</function></entry>
+      <entry>Display*</entry>
+    </row>
+    <row>
+      <entry><function>XtRBoolean</function></entry>
+      <entry><function>XtCvtStringToBoolean</function></entry>
+    </row>
+    <row>
+      <entry><function>XtRBool</function></entry>
+      <entry><function>XtCvtStringToBool</function></entry>
+    </row>
+    <row>
+      <entry><function>XtRCommandArgArray</function></entry>
+      <entry><function>XtCvtStringToCommandArgArray</function></entry>
+    </row>
+    <row>
+      <entry><function>XtRCursor</function></entry>
+      <entry><function>XtCvtStringToCursor</function></entry>
+      <entry>Display*</entry>
+    </row>
+    <row>
+      <entry><function>XtRDimension</function></entry>
+      <entry><function>XtCvtStringToDimension</function></entry>
+    </row>
+    <row>
+      <entry><function>XtRDirectoryString</function></entry>
+      <entry><function>XtCvtStringToDirectoryString</function></entry>
+    </row>
+    <row>
+      <entry><function>XtRDisplay</function></entry>
+      <entry><function>XtCvtStringToDisplay</function></entry>
+    </row>
+    <row>
+      <entry><function>XtRFile</function></entry>
+      <entry><function>XtCvtStringToFile</function></entry>
+    </row>
+    <row>
+      <entry><function>XtRFloat</function></entry>
+      <entry><function>XtCvtStringToFloat</function></entry>
+    </row>
+    <row>
+      <entry><function>XtRFont</function></entry>
+      <entry><function>XtCvtStringToFont</function></entry>
+      <entry>Display*</entry>
+    </row>
+    <row>
+      <entry><function>XtRFontSet</function></entry>
+      <entry><function>XtCvtStringToFontSet</function></entry>
+      <entry>Display*, String <emphasis remap='I'>locale</emphasis></entry>
+    </row>
+    <row>
+      <entry><function>XtRFontStruct</function></entry>
+      <entry><function>XtCvtStringToFontStruct</function></entry>
+      <entry>Display*</entry>
+    </row>
+    <row>
+      <entry><function>XtRGravity</function></entry>
+      <entry><function>XtCvtStringToGravity</function></entry>
+    </row>
+    <row>
+      <entry><function>XtRInitialState</function></entry>
+      <entry><function>XtCvtStringToInitialState</function></entry>
+    </row>
+    <row>
+      <entry><function>XtRInt</function></entry>
+      <entry><function>XtCvtStringToInt</function></entry>
+    </row>
+    <row>
+      <entry><function>XtRPixel</function></entry>
+      <entry><function>XtCvtStringToPixel</function></entry>
+      <entry><function>colorConvertArgs</function></entry>
+    </row>
+    <row>
+      <entry><function>XtRPosition</function></entry>
+      <entry><function>XtCvtStringToPosition</function></entry>
+    </row>
+    <row>
+      <entry><function>XtRRestartStyle</function></entry>
+      <entry><function>XtCvtStringToRestartStyle</function></entry>
+    </row>
+    <row>
+      <entry><function>XtRShort</function></entry>
+      <entry><function>XtCvtStringToShort</function></entry>
+    </row>
+    <row>
+      <entry><function>XtRTranslationTable</function></entry>
+      <entry><function>XtCvtStringToTranslationTable</function></entry>
+    </row>
+    <row>
+      <entry><function>XtRUnsignedChar</function></entry>
+      <entry><function>XtCvtStringToUnsignedChar</function></entry>
+    </row>
+    <row>
+      <entry><function>XtRVisual</function></entry>
+      <entry><function>XtCvtStringToVisual</function></entry>
+      <entry>Screen*, Cardinal <emphasis remap='I'>depth</emphasis></entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+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>.
+They evaluate to the black and white pixel values of the widget's screen,
+respectively.
+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>
+and evaluate this in the following manner:
+</para>
+<itemizedlist spacing='compact'>
+  <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>
+The String-to-FontSet converter recognizes the constant
+<function>XtDefaultFontSet</function>
+and evaluate this in the following manner:
+</para>
+<itemizedlist spacing='compact'>
+  <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>
+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 Intrinsics 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>
+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'>Xlib â€” C Language X Interface.</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>
+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>
+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>
+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>
+The String-to-InitialState conversion accepts the values
+<function>NormalState</function>
+or
+<function>IconicState</function>
+as defined by the <emphasis remap='I'>Inter-Client Communication Conventions Manual.</emphasis>.
+</para>
+
+<para>
+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'>X Window System Protocol</emphasis>,
+Section 8;
+<function>StaticGray</function>,
+<function>StaticColor</function>,
+<function>TrueColor</function>,
+<function>GrayScale</function>,
+<function>PseudoColor</function>,
+and
+<function>DirectColor</function>.
+</para>
+
+<para>
+The Intrinsics register the following resource converter that accepts
+an input value of representation type
+<function>XtRColor</function>.
+</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='3' align='left' rowsep='0' colsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <colspec colwidth='1.0*' colname='c3'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Target Representation</entry>
+      <entry>Converter Name</entry>
+      <entry>Additional Args</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry><function>XtRPixel</function></entry>
+      <entry><function>XtCvtColorToPixel</function></entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+The Intrinsics register the following resource converters that accept
+input values of representation type
+<function>XtRInt</function>.
+</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='3' align='left' rowsep='0' colsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <colspec colwidth='1.0*' colname='c3'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Target Representation</entry>
+      <entry>Converter Name</entry>
+      <entry>Additional Args</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry><function>XtRBoolean</function></entry>
+      <entry><function>XtCvtIntToBoolean</function></entry>
+    </row>
+    <row>
+      <entry><function>XtRBool</function></entry>
+      <entry><function>XtCvtIntToBool</function></entry>
+    </row>
+    <row>
+      <entry><function>XtRColor</function></entry>
+      <entry><function>XtCvtIntToColor</function></entry>
+      <entry><function>colorConvertArgs</function></entry>
+    </row>
+    <row>
+      <entry><function>XtRDimension</function></entry>
+      <entry><function>XtCvtIntToDimension</function></entry>
+    </row>
+    <row>
+      <entry><function>XtRFloat</function></entry>
+      <entry><function>XtCvtIntToFloat</function></entry>
+    </row>
+    <row>
+      <entry><function>XtRFont</function></entry>
+      <entry><function>XtCvtIntToFont</function></entry>
+    </row>
+    <row>
+      <entry><function>XtRPixel</function></entry>
+      <entry><function>XtCvtIntToPixel</function></entry>
+    </row>
+    <row>
+      <entry><function>XtRPixmap</function></entry>
+      <entry><function>XtCvtIntToPixmap</function></entry>
+    </row>
+    <row>
+      <entry><function>XtRPosition</function></entry>
+      <entry><function>XtCvtIntToPosition</function></entry>
+    </row>
+    <row>
+      <entry><function>XtRShort</function></entry>
+      <entry><function>XtCvtIntToShort</function></entry>
+    </row>
+    <row>
+      <entry><function>XtRUnsignedChar</function></entry>
+      <entry><function>XtCvtIntToUnsignedChar</function></entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+The Intrinsics register the following resource converter that accepts
+an input value of representation type
+<function>XtRPixel</function>.
+</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='3' align='left' rowsep='0' colsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <colspec colwidth='1.0*' colname='c3'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Target Representation</entry>
+      <entry>Converter Name</entry>
+      <entry>Additional Args</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry><function>XtRColor</function></entry>
+      <entry><function>XtCvtPixelToColor</function></entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+</sect2>
+
+<sect2 id="New_Resource_Converters">
+<title>New Resource Converters</title>
+<para>
+Type converters use pointers to
+<function>XrmValue</function>
+structures (defined in
+<function>&lt;X11/Xresource.h&gt;;</function>
+see <olink targetdoc='libX11' targetptr='Creating_and_Storing_Databases'>Section 15.4</olink> in
+<olink targetdoc='libX11' targetptr='libX11'>Xlib â€” C Language X Interface.</olink>)
+for input and output values.
+</para>
+<literallayout >
+typedef struct {
+       unsigned int size;
+       XPointer addr;
+} XrmValue, *XrmValuePtr;
+</literallayout>
+<para>
+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>
+A resource converter procedure pointer is of type
+<xref linkend='XtTypeConverter' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtTypeConverter'>
+<funcprototype>
+<funcdef>typedef Boolean <function>(*XtTypeConverter)</function></funcdef>
+   <paramdef>Display *<parameter>display</parameter></paramdef>
+   <paramdef>XrmValue *<parameter>args</parameter></paramdef>
+   <paramdef>Cardinal *<parameter>num_args</parameter></paramdef>
+   <paramdef>XrmValue *<parameter>from</parameter></paramdef>
+   <paramdef>XrmValue *<parameter>to</parameter></paramdef>
+   <paramdef>XtPointer *<parameter>converter_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+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>
+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 Intrinsics.
+</para>
+
+<para>
+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
+<xref linkend='XtAppWarningMsg' xrefstyle='select: title'/>.
+</para>
+
+<para>
+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>
+Note that if an address is written into <emphasis remap='I'>to-&gt;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,
+<xref linkend='XtGetApplicationResources' xrefstyle='select: title'/>,
+or
+<xref linkend='XtGetSubresources' xrefstyle='select: title'/>
+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>
+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 Intrinsics that the converted value is
+a function of the particular display (and colormap).
+</para>
+
+<literallayout >
+#define done(type, value) \\
+       {                                               \\
+               if (toVal-&gt;addr != NULL) {           \\
+                       if (toVal-&gt;size &lt; sizeof(type)) { \\
+                               toVal-&gt;size = sizeof(type);  \\
+                               return False;   \\
+                       }                               \\
+                       *(type*)(toVal-&gt;addr) = (value);     \\
+               }                                       \\
+               else {                          \\
+                       static type static_val; \\
+                       static_val = (value);   \\
+                       toVal-&gt;addr = (XPointer)&amp;static_val;     \\
+               }                                       \\
+               toVal-&gt;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-&gt;addr,
+                                              &amp;screenColor, &amp;exactColor);
+       if (status == 0) {
+               String params[1];
+               Cardinal num_params = 1;
+               params[0] = (String)fromVal-&gt;addr;
+               XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+                       "noColormap", "cvtStringToPixel", "XtToolkitError",
+                       "Cannot allocate colormap entry for \\"%s\\"", params,\
+ &amp;num_params);
+               *converter_data = (char *) False;
+                return False;
+       } else {
+                *converter_data = (char *) True;
+               done(Pixel, &amp;screenColor.pixel);
+       }
+}
+</literallayout>
+
+<para>
+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>.
+</para>
+
+<para>
+To allow the Intrinsics to deallocate resources produced by type
+converters, a resource destructor procedure may also be provided.
+</para>
+
+<para>
+A resource destructor procedure pointer is of type
+<xref linkend='XtDestructor' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtDestructor'>
+<funcprototype>
+  <funcdef>typedef void <function>(*XtDestructor)</function></funcdef>
+   <paramdef>XtAppContext <parameter>app</parameter></paramdef>
+   <paramdef>XrmValue *<parameter>to</parameter></paramdef>
+   <paramdef>XtPointer <parameter>converter_data</parameter></paramdef>
+   <paramdef>XrmValue *<parameter>args</parameter></paramdef>
+   <paramdef>Cardinal *<parameter>num_args</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+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>
+</sect2>
+
+<sect2 id="Issuing_Conversion_Warnings">
+<title>Issuing Conversion Warnings</title>
+<para>
+The
+<xref linkend='XtDisplayStringConversionWarning' xrefstyle='select: title'/>
+procedure is a convenience routine for resource type converters
+that convert from string values.
+</para>
+
+<funcsynopsis id='XtDisplayStringConversionWarning'>
+<funcprototype>
+<funcdef>void <function>XtDisplayStringConversionWarning</function></funcdef>
+   <paramdef>Display *<parameter>display</parameter></paramdef>
+   <paramdef>String <parameter>from_value</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtDisplayStringConversionWarning' xrefstyle='select: title'/>
+procedure issues a warning message using
+<xref linkend='XtAppWarningMsg' xrefstyle='select: title'/>
+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>
+To issue other types of warning or error messages, the type converter
+should use
+<xref linkend='XtAppWarningMsg' xrefstyle='select: title'/>
+or
+<xref linkend='XtAppErrorMsg' xrefstyle='select: title'/>.
+</para>
+
+<para>
+To retrieve the application context associated with a given
+display connection, use
+<xref linkend='XtDisplayToApplicationContext' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtDisplayToApplicationContext'>
+<funcprototype>
+<funcdef>XtAppContext <function>XtDisplayToApplicationContext</function></funcdef>
+   <paramdef>Display *<parameter>display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies an open and initialized display connection.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtDisplayToApplicationContext' xrefstyle='select: title'/>
+function returns the application
+context in which the specified <emphasis remap='I'>display</emphasis> was initialized.  If the
+display is not known to the Intrinsics, an error message is issued.
+</para>
+</sect2>
+
+<sect2 id="Registering_a_New_Resource_Converter">
+<title>Registering a New Resource Converter</title>
+<para>
+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>
+argument.  </para>
+
+<literallayout >
+typedef int XtCacheType;
+</literallayout>
+
+<para>
+An <function>XtCacheType</function>
+field may contain one of the following values:
+</para>
+
+<para>
+<function>XtCacheNone</function>
+</para>
+<itemizedlist spacing='compact'>
+  <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.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<function>XtCacheAll</function>
+</para>
+<itemizedlist spacing='compact'>
+  <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.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<function>XtCacheByDisplay</function>
+</para>
+<itemizedlist spacing='compact'>
+  <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
+<xref linkend='XtCloseDisplay' xrefstyle='select: title'/>
+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>
+The qualifier
+<function>XtCacheRefCount</function>
+may be ORed with any of the above values.  If
+<function>XtCacheRefCount</function>
+is specified, calls to
+<xref linkend='XtCreateWidget' xrefstyle='select: title'/>,
+<xref linkend='XtCreateManagedWidget' xrefstyle='select: title'/>,
+<xref linkend='XtGetApplicationResources' xrefstyle='select: title'/>,
+and
+<xref linkend='XtGetSubresources' xrefstyle='select: title'/>
+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>
+To register a type converter for all application contexts in a
+process, use
+<xref linkend='XtSetTypeConverter' xrefstyle='select: title'/>,
+and to register a type converter in a single application context, use
+<xref linkend='XtAppSetTypeConverter' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtSetTypeConverter'>
+<funcprototype>
+<funcdef>void <function>XtSetTypeConverter</function></funcdef>
+   <paramdef>String <parameter>from_type</parameter></paramdef>
+   <paramdef>String <parameter>to_type</parameter></paramdef>
+   <paramdef>XtTypeConverter <parameter>converter</parameter></paramdef>
+   <paramdef>XtConvertArgList <parameter>convert_args</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_args</parameter></paramdef>
+   <paramdef>XtCacheType <parameter>cache_type</parameter></paramdef>
+   <paramdef>XtDestructor <parameter>destructor</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+
+
+<funcsynopsis id='XtAppSetTypeConverter'>
+<funcprototype>
+<funcdef> <function>XtAppSetTypeConverter</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+   <paramdef>String <parameter>from_type</parameter></paramdef>
+   <paramdef>String <parameter>to_type</parameter></paramdef>
+   <paramdef>XtTypeConverter <parameter>converter</parameter></paramdef>
+   <paramdef>XtConvertArgList <parameter>convert_args</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_args</parameter></paramdef>
+   <paramdef>XtCacheType <parameter>cache_type</parameter></paramdef>
+   <paramdef>XtDestructor <parameter>destructor</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+<xref linkend='XtSetTypeConverter' xrefstyle='select: title'/>
+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.
+<xref linkend='XtAppSetTypeConverter' xrefstyle='select: title'/>
+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.
+</para>
+
+<para>
+For the few type converters that need additional arguments,
+the Intrinsics 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>&lt;X11/Intrinsic.h&gt;</function>.
+</para>
+<literallayout >
+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;
+
+typedef struct {
+       XtAddressMode address_mode;
+       XtPointer address_id;
+       Cardinal size;
+} XtConvertArgRec, *XtConvertArgList;
+</literallayout>
+<para>
+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>
+causes <emphasis remap='I'>address_id</emphasis> to be interpreted as the address of the data.
+<function>XtBaseOffset</function>
+causes <emphasis remap='I'>address_id</emphasis> to be interpreted as the offset from the widget base.
+<function>XtImmediate</function>
+causes <emphasis remap='I'>address_id</emphasis> to be interpreted as a constant.
+<function>XtResourceString</function>
+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>
+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>
+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 <xref linkend='Nonwidget_Objects' />).
+<function>XtProcedureArg</function>
+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
+<xref linkend='XtConvertArgProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtConvertArgProc'>
+<funcprototype>
+<funcdef>typedef void <function>(*XtConvertArgProc)</function></funcdef>
+   <paramdef>XtAppContext <parameter>app</parameter></paramdef>
+   <paramdef>XrmValue *<parameter>to</parameter></paramdef>
+   <paramdef>XtPointer <parameter>converter_data</parameter></paramdef>
+   <paramdef>XrmValue *<parameter>args</parameter></paramdef>
+   <paramdef>Cardinal *<parameter>num_args</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+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>
+</sect2>
+
+<sect2 id="Resource_Converter_Invocation">
+<title>Resource Converter Invocation</title>
+<para>
+All resource-fetching routines (for example,
+<xref linkend='XtGetSubresources' xrefstyle='select: title'/>,
+<xref linkend='XtGetApplicationResources' xrefstyle='select: title'/>,
+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.
+</para>
+
+<para>
+To invoke explicit resource conversions, use
+<xref linkend='XtConvertAndStore' xrefstyle='select: title'/>
+or
+<xref linkend='XtCallConverter' xrefstyle='select: title'/>.
+</para>
+<literallayout >
+typedef XtPointer XtCacheRef;
+</literallayout>
+
+<funcsynopsis id='XtCallConverter'>
+<funcprototype>
+<funcdef>Boolean  <function>XtCallConverter</function></funcdef>
+   <paramdef>Display* <parameter>display</parameter></paramdef>
+   <paramdef>XtTypeConverter <parameter>converter</parameter></paramdef>
+   <paramdef>XrmValuePtr <parameter>conversion_args</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_args</parameter></paramdef>
+   <paramdef>XrmValuePtr <parameter>from</parameter></paramdef>
+   <paramdef>XrmValuePtr <parameter>to_in_out</parameter></paramdef>
+   <paramdef>XtCacheRef *<parameter>cache_ref_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtCallConverter' xrefstyle='select: title'/>
+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,
+<xref linkend='XtCallConverter' xrefstyle='select: title'/>
+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-&gt;addr</emphasis>, stores the cache size into <emphasis remap='I'>to-&gt;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,
+<xref linkend='XtCallConverter' xrefstyle='select: title'/>
+copies the cache size into <emphasis remap='I'>to-&gt;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,
+<xref linkend='XtCallConverter' xrefstyle='select: title'/>
+calls the converter, and if it was not registered with cache type
+<function>XtCacheNone</function>,
+enters the result in the cache.
+<xref linkend='XtCallConverter' xrefstyle='select: title'/>
+then returns what the converter returned.
+</para>
+
+<para>
+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.
+</para>
+
+<para>
+To explicitly decrement the reference counts for resources obtained
+from
+<xref linkend='XtCallConverter' xrefstyle='select: title'/>,
+use
+<xref linkend='XtAppReleaseCacheRefs' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppReleaseCacheRefs'>
+<funcprototype>
+<funcdef>void <function>XtAppReleaseCacheRefs</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+   <paramdef>XtCacheRef *<parameter>refs</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+<xref linkend='XtAppReleaseCacheRefs' xrefstyle='select: title'/>
+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.
+</para>
+
+<para>
+As a convenience to clients needing to explicitly decrement reference
+counts via a callback function, the Intrinsics define two callback
+procedures,
+<xref linkend='XtCallbackReleaseCacheRef' xrefstyle='select: title'/>
+and
+<xref linkend='XtCallbackReleaseCacheRefList' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtCallbackReleaseCacheRef'>
+<funcprototype>
+<funcdef>void <function>XtCallbackReleaseCacheRef</function></funcdef>
+   <paramdef>Widget <parameter>object</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+   <paramdef>XtPointer <parameter>call_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+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>
+
+<funcsynopsis id='XtCallbackReleaseCacheRefList'>
+<funcprototype>
+<funcdef>void <function>XtCallbackReleaseCacheRefList</function></funcdef>
+   <paramdef>Widget <parameter>object</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+   <paramdef>XtPointer <parameter>call_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+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.
+</para>
+
+<para>
+To lookup and call a resource converter, copy the resulting value,
+and free a cached resource when a widget is destroyed, use
+<xref linkend='XtConvertAndStore' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtConvertAndStore'>
+<funcprototype>
+<funcdef>Boolean <function>XtConvertAndStore</function></funcdef>
+   <paramdef>Widget <parameter>object</parameter></paramdef>
+   <paramdef>String <parameter>from_type</parameter></paramdef>
+   <paramdef>XrmValuePtr <parameter>from</parameter></paramdef>
+   <paramdef>String <parameter>to_type</parameter></paramdef>
+   <paramdef>XrmValuePtr <parameter>to_in_out</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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.  Must be of class Object or any subclass thereof.
+      </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>
+The
+<xref linkend='XtConvertAndStore' xrefstyle='select: title'/>
+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
+<xref linkend='XtCallConverter' xrefstyle='select: title'/>
+(or
+<xref linkend='XtDirectConvert' xrefstyle='select: title'/>
+if an old-style converter was registered with
+<xref linkend='XtAddConverter' xrefstyle='select: title'/>
+or
+<xref linkend='XtAppAddConverter' xrefstyle='select: title'/>;
+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,
+<xref linkend='XtConvertAndStore' xrefstyle='select: title'/>
+returns
+<function>True</function>;
+otherwise, it returns
+<function>False</function>.
+</para>
+
+<para>
+<xref linkend='XtConvertAndStore' xrefstyle='select: title'/>
+adds
+<xref linkend='XtCallbackReleaseCacheRef' xrefstyle='select: title'/>
+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>
+<xref linkend='XtCreateWidget' xrefstyle='select: title'/>
+performs processing equivalent to
+<xref linkend='XtConvertAndStore' xrefstyle='select: title'/>
+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>
+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,
+class
+XtCInitialResourcesPersistent.
+</para>
+
+<para>
+When
+<xref linkend='XtCreateWidget' xrefstyle='select: title'/>
+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
+XtNinitialResourcesPersistent.
+</para>
+
+<para>
+The resources are still freed and destructors called when
+<xref linkend='XtCloseDisplay' xrefstyle='select: title'/>
+is called if the conversion was registered as
+<function>XtCacheByDisplay</function>.
+</para>
+</sect2>
+</sect1>
+
+<sect1 id="Reading_and_Writing_Widget_State">
+<title>Reading and Writing Widget State</title>
+<para>
+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>
+<sect2 id="Obtaining_Widget_State">
+<title>Obtaining Widget State</title>
+<para>
+To retrieve the current values of resources associated with a
+widget instance, use
+<xref linkend='XtGetValues' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtGetValues'>
+<funcprototype>
+<funcdef>void <function>XtGetValues</function></funcdef>
+   <paramdef>Widget <parameter>object</parameter></paramdef>
+   <paramdef>ArgList <parameter>args</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_args</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>object</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the object whose resource values are to be returned.  Must be of class Object or any subclass thereof.
+      </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>
+The
+<xref linkend='XtGetValues' xrefstyle='select: title'/>
+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
+Intrinsics-defined resources, the following lifetimes apply:
+</para>
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+Not valid following any operation that modifies the resource:
+    </para>
+  </listitem>
+  <listitem>
+    <itemizedlist spacing='compact'>
+      <listitem>
+        <para>
+XtNchildren resource of composite widgets.
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+All resources of representation type XtRCallback.
+        </para>
+      </listitem>
+    </itemizedlist>
+  </listitem>
+  <listitem>
+    <para>
+Remain valid at least until the widget is destroyed:
+    </para>
+  </listitem>
+  <listitem>
+    <itemizedlist spacing='compact'>
+      <listitem>
+        <para>
+XtNaccelerators, XtNtranslations.
+        </para>
+      </listitem>
+    </itemizedlist>
+  </listitem>
+  <listitem>
+    <para>
+Remain valid until the Display is closed:
+    </para>
+  </listitem>
+  <listitem>
+    <itemizedlist spacing='compact'>
+      <listitem>
+        <para>
+XtNscreen.
+        </para>
+      </listitem>
+    </itemizedlist>
+  </listitem>
+</itemizedlist>
+<para>
+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>
+If the class of the object's parent is a subclass of
+<function>constraintWidgetClass</function>,
+<xref linkend='XtGetValues' xrefstyle='select: title'/>
+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.
+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
+<xref linkend='XtGetValues' xrefstyle='select: title'/>.
+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
+<emphasis role='strong'>NULLQUARK</emphasis>,
+and if the <emphasis remap='I'>get_values_hook</emphasis> field in the extension record is non-NULL,
+<xref linkend='XtGetValues' xrefstyle='select: title'/>
+calls the get_values_hook procedures in superclass-to-subclass order.
+This permits a Constraint parent to provide
+nonresource data via
+<xref linkend='XtGetValues' xrefstyle='select: title'/>.
+</para>
+
+<para>
+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 Intrinsics-defined object classes copy
+data in this manner.  Any operation that modifies the queried
+object resource may invalidate the pointed-to data.
+</para>
+
+<para>
+To retrieve the current values of resources associated with a widget
+instance using varargs lists, use
+<xref linkend='XtVaGetValues' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtVaGetValues'>
+<funcprototype>
+<funcdef>void <function>XtVaGetValues</function></funcdef>
+   <paramdef>Widget <parameter>object</parameter></paramdef>
+   <paramdef><parameter>...</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>object</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the object whose resource values are to be returned.  Must be of class Object or any subclass thereof.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      ...
+    </term>
+    <listitem>
+      <para>
+Specifies the variable argument list for the resources to
+be returned.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<xref linkend='XtVaGetValues' xrefstyle='select: title'/>
+is identical in function to
+<xref linkend='XtGetValues' xrefstyle='select: title'/>
+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>
+<sect3 id="Widget_Subpart_Resource_Data_The_get_values_hook_Procedure">
+<title>Widget Subpart Resource Data: The get_values_hook Procedure</title>
+<para>
+Widgets that have subparts can return resource values from them through
+<xref linkend='XtGetValues' xrefstyle='select: title'/>
+by supplying a get_values_hook procedure.
+The get_values_hook procedure pointer is of type
+<xref linkend='XtArgsProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='_XtArgsProc'>
+<funcprototype>
+<funcdef>typedef void <function>(*XtArgsProc)</function></funcdef>
+
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>ArgList <parameter>args</parameter></paramdef>
+   <paramdef>Cardinal *<parameter>num_args</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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
+<xref linkend='XtGetValues' xrefstyle='select: title'/>
+or the transformed varargs list passed to
+<xref linkend='XtVaGetValues' xrefstyle='select: title'/>.
+      </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>
+The widget with subpart resources should call
+<xref linkend='XtGetSubvalues' xrefstyle='select: title'/>
+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>
+</sect3>
+<sect3 id="Widget_Subpart_State">
+<title>Widget Subpart State</title>
+<para>
+To retrieve the current values of subpart resource data associated with a
+widget instance, use
+<xref linkend='XtGetSubvalues' xrefstyle='select: title'/>.
+For a discussion of subpart resources,
+see <xref linkend='Subresources' />.
+</para>
+
+<funcsynopsis id='XtGetSubvalues'>
+<funcprototype>
+<funcdef>void <function>XtGetSubvalues</function></funcdef>
+   <paramdef>XtPointer <parameter>base</parameter></paramdef>
+   <paramdef>XtResourceList <parameter>resources</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_resources</parameter></paramdef>
+   <paramdef>ArgList <parameter>args</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_args</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtGetSubvalues' xrefstyle='select: title'/>
+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.
+</para>
+
+<para>
+To retrieve the current values of subpart resources associated with
+a widget instance using varargs lists, use
+<xref linkend='XtVaGetSubvalues' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtVaGetSubvalues'>
+<funcprototype>
+<funcdef>void <function>XtVaGetSubvalues</function></funcdef>
+   <paramdef>XtPointer <parameter>base</parameter></paramdef>
+   <paramdef>XtResourceList <parameter>resources</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_resources</parameter></paramdef>
+   <paramdef> <parameter>...</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+<xref linkend='XtVaGetSubvalues' xrefstyle='select: title'/>
+is identical in function to
+<xref linkend='XtGetSubvalues' xrefstyle='select: title'/>
+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
+<xref linkend='XtVaGetSubvalues' xrefstyle='select: title'/>.
+If
+<function>XtVaTypedArg</function>
+is specified in the list, a warning message is issued
+and the entry is then ignored.
+</para>
+</sect3>
+</sect2>
+
+<sect2 id="Setting_Widget_State">
+<title>Setting Widget State</title>
+<para>
+To modify the current values of resources associated with a widget
+instance, use
+<xref linkend='XtSetValues' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtSetValues'>
+<funcprototype>
+<funcdef>void <function>XtSetValues</function></funcdef>
+   <paramdef>Widget <parameter>object</parameter></paramdef>
+   <paramdef>ArgList <parameter>args</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_args</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>object</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the object whose resources are to be modified.  Must be of class Object or any subclass thereof.
+      </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>
+The
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+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.
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+then calls the set_values procedures for the object in superclass-to-subclass
+order.
+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
+<xref linkend='XtSetValues' xrefstyle='select: title'/>.
+</para>
+
+<para>
+If the class of the object's parent is a subclass of
+<function>constraintWidgetClass</function>,
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+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>
+If the object is of a subclass of
+RectObj,
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+determines if a geometry request is needed by comparing the old object to
+the new object.
+If any geometry changes are required,
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+restores the original geometry and makes the request on behalf of the widget.
+If the geometry manager returns
+<function>XtGeometryYes</function>,
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+calls the object's resize procedure.
+If the geometry manager returns
+<function>XtGeometryDone</function>,
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+continues, as the object's resize procedure should have been called
+by the geometry manager.
+If the geometry manager returns
+<function>XtGeometryNo</function>,
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+ignores the geometry request and continues.
+If the geometry manager returns
+<function>XtGeometryAlmost</function>,
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+calls the set_values_almost procedure,
+which determines what should be done.
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+then repeats this process,
+deciding once more whether the geometry manager should be called.
+</para>
+
+<para>
+Finally, if any of the set_values procedures returned
+<function>True</function>,
+and the widget is realized,
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+causes the widget's expose procedure to be invoked by calling
+<function>XClearArea</function>
+on the widget's window.
+</para>
+
+<para>
+To modify the current values of resources associated with a widget
+instance using varargs lists, use
+<xref linkend='XtVaSetValues' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtVaSetValues'>
+<funcprototype>
+<funcdef>void <function>XtVaSetValues</function></funcdef>
+   <paramdef>Widget <parameter>object</parameter></paramdef>
+   <paramdef> <parameter>...</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>object</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the object whose resources are to be modified.  Must be of class Object or any subclass thereof.
+      </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>
+<xref linkend='XtVaSetValues' xrefstyle='select: title'/>
+is identical in function to
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+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 id="Widget_State_The_set_values_Procedure">
+<title>Widget State: The set_values Procedure</title>
+<para>
+The set_values procedure pointer in a widget class is of type
+<xref linkend='XtSetValuesFunc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtSetValuesFunc'>
+<funcprototype>
+<funcdef>typedef Boolean <function>(*XtSetValuesFunc)</function></funcdef>
+
+   <paramdef>Widget <parameter>current</parameter></paramdef>
+   <paramdef>Widget <parameter>request</parameter></paramdef>
+   <paramdef>Widget <parameter>new</parameter></paramdef>
+   <paramdef>ArgList <parameter>args</parameter></paramdef>
+   <paramdef>Cardinal *<parameter>num_args</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>current</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a copy of the widget as it was before the
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+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
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+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
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+or the transformed argument list passed to
+<xref linkend='XtVaSetValues' xrefstyle='select: title'/>.
+      </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>
+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>
+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>
+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>
+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>
+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>
+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>
+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>
+Before calling the set_values procedures, the Intrinsics 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>
+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,
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+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>
+Set_values procedures should not do any work in response to changes in
+geometry because
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+eventually will perform a geometry request, and that request might be denied.
+If the widget actually changes size in response to a
+call to
+<xref linkend='XtSetValues' xrefstyle='select: title'/>,
+its resize procedure is called.
+Widgets should do any geometry-related work in their resize procedure.
+</para>
+
+<para>
+Note that it is permissible to call
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+before a widget is realized.
+Therefore, the set_values procedure must not assume that the widget is realized.
+</para>
+</sect3>
+<sect3 id="Widget_State_The_set_values_almost_Procedure">
+<title>Widget State: The set_values_almost Procedure</title>
+<para>
+The set_values_almost procedure pointer in the widget class record is of type
+<xref linkend='XtAlmostProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAlmostProc'>
+<funcprototype>
+<funcdef>typedef void <function>(*XtAlmostProc)</function></funcdef>
+
+   <paramdef>Widget <parameter>old</parameter></paramdef>
+   <paramdef>Widget <parameter>new</parameter></paramdef>
+   <paramdef>XtWidgetGeometry *<parameter>request</parameter></paramdef>
+   <paramdef>XtWidgetGeometry *<parameter>reply</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>old</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a copy of the object as it was before the
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+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>
+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>
+The set_values_almost procedure is called when a client tries to set a widget's
+geometry by means of a call to
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+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
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+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-&gt;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-&gt;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>
+</sect3>
+<sect3 id="Widget_State_The_ConstraintClassPart_set_values_Procedure">
+<title>Widget State: The ConstraintClassPart set_values Procedure</title>
+<para>
+The constraint set_values procedure pointer is of type
+<xref linkend='XtSetValuesFunc' xrefstyle='select: title'/>.
+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>
+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>
+</sect3>
+<sect3 id='Widget_Subpart_State_2'>
+<title>Widget Subpart State</title>
+<para>
+To set the current values of subpart resources associated with a
+widget instance, use
+<xref linkend='XtSetSubvalues' xrefstyle='select: title'/>.
+For a discussion of subpart resources,
+see <xref linkend='Subresources' />.
+</para>
+
+<funcsynopsis id='XtSetSubvalues'>
+<funcprototype>
+<funcdef>void <function>XtSetSubvalues</function></funcdef>
+   <paramdef>XtPointer <parameter>base</parameter></paramdef>
+   <paramdef>XtResourceList <parameter>resources</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_resources</parameter></paramdef>
+   <paramdef>ArgList <parameter>args</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_args</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtSetSubvalues' xrefstyle='select: title'/>
+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.
+</para>
+
+<para>
+To set the current values of subpart resources associated with
+a widget instance using varargs lists, use
+<xref linkend='XtVaSetSubvalues' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtVaSetSubvalues'>
+<funcprototype>
+<funcdef>void <function>XtVaSetSubvalues</function></funcdef>
+   <paramdef>XtPointer <parameter>base</parameter></paramdef>
+   <paramdef>XtResourceList <parameter>resources</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_resources</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+<xref linkend='XtVaSetSubvalues' xrefstyle='select: title'/>
+is identical in function to
+<xref linkend='XtSetSubvalues' xrefstyle='select: title'/>
+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
+<xref linkend='XtVaSetSubvalues' xrefstyle='select: title'/>.
+If an entry containing
+<function>XtVaTypedArg</function>
+is specified in the list, a warning message is issued
+and the entry is ignored.
+</para>
+</sect3>
+
+<sect3 id='Widget_Subpart_Resource_Data_The_set_values_hook_Procedure'>
+<title>Widget Subpart Resource Data: The set_values_hook Procedure</title>
+<note><para>
+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.
+</para>
+</note>
+<para>
+Widgets that have a subpart can set the subpart resource values through
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+by supplying a set_values_hook procedure.
+The set_values_hook procedure pointer in a widget class is of type
+<xref linkend='XtArgsFunc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtArgsFunc'>
+<funcprototype>
+<funcdef>typedef Boolean <function>(*XtArgsFunc)</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>Arglist <parameter>args</parameter></paramdef>
+   <paramdef>Cardinal *<parameter>num_args</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+or the transformed varargs list passed to
+<xref linkend='XtVaSetValues' xrefstyle='select: title'/>.
+      </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>
+The widget with subpart resources may call
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+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.
+</para>
+</sect3>
+</sect2>
+</sect1>
+</chapter>
diff --git a/specs/CH10.xml b/specs/CH10.xml
new file mode 100644 (file)
index 0000000..a96d2c4
--- /dev/null
@@ -0,0 +1,2211 @@
+<chapter id='Translation_Management'>
+<title>Translation Management</title>
+<para>
+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>
+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>
+The translation manager uses two kinds of tables to perform translations:
+</para>
+<itemizedlist spacing='compact'>
+  <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>
+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 <xref linkend='Translation_Table_Management' />.
+</para>
+<sect1 id="Action_Tables">
+<title>Action Tables</title>
+<para>
+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
+<xref linkend='XtActionProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtActionProc'>
+<funcprototype>
+<funcdef>typedef void <function>(*XtActionProc)</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>XEvent *<parameter>event</parameter></paramdef>
+   <paramdef>String *<parameter>params</parameter></paramdef>
+   <paramdef>Cardinal *<parameter>num_params</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<literallayout >
+typedef struct _XtActionsRec {
+       String string;
+       XtActionProc proc;
+} XtActionsRec, *XtActionList;
+</literallayout>
+<para>
+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>
+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>
+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>
+For example, a Pushbutton widget has procedures to take the following actions:
+</para>
+<itemizedlist spacing='compact'>
+  <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>
+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>
+<literallayout >
+XtActionsRec actionTable[] = {
+       {"Set", Set},
+       {"Unset",       Unset},
+       {"Highlight",   Highlight},
+       {"Unhighlight", Unhighlight}
+       {"Notify",      Notify},
+};
+</literallayout>
+<para>
+The Intrinsics 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 Intrinsics functions.
+</para>
+<sect2 id="Action_Table_Registration">
+<title>Action Table Registration</title>
+<para>
+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 Intrinsics 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 Intrinsics may overwrite the storage in order to compile the
+list into an internal representation.
+</para>
+
+<para>
+To declare an action table within an application
+and register it with the translation manager, use
+<xref linkend='XtAppAddActions' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppAddActions'>
+<funcprototype>
+<funcdef>void <function>XtAppAddActions</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+   <paramdef>XtActionList <parameter>actions</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_actions</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+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 Intrinsics register an action table containing
+<xref linkend='XtMenuPopup' xrefstyle='select: title'/>
+and
+<xref linkend='XtMenuPopdown' xrefstyle='select: title'/>
+as part of
+<xref linkend='XtCreateApplicationContext' xrefstyle='select: title'/>.
+</para>
+</sect2>
+
+<sect2 id="Action_Names_to_Procedure_Translations">
+<title>Action Names to Procedure Translations</title>
+<para>
+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 spacing='compact'>
+  <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
+<xref linkend='XtAppAddActions' xrefstyle='select: title'/>
+and
+<xref linkend='XtAddActions' xrefstyle='select: title'/>
+from the most recently added table to the oldest table.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+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>
+</sect2>
+
+<sect2 id="Action_Hook_Registration">
+<title>Action Hook Registration</title>
+<para>
+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
+<xref linkend='XtActionHookProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtActionHookProc'>
+<funcprototype>
+<funcdef>typedef void <function>(*XtActionHookProc)</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+   <paramdef>String <parameter>action_name</parameter></paramdef>
+   <paramdef>XEvent* <parameter>event</parameter></paramdef>
+   <paramdef>String* <parameter>params</parameter></paramdef>
+   <paramdef>Cardinal* <parameter>num_params</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+
+
+<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>
+Action hooks should not modify any of the data pointed to by the
+arguments other than the <emphasis remap='I'>client_data</emphasis> argument.
+</para>
+
+<para>
+To add an action hook, use
+<xref linkend='XtAppAddActionHook' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppAddActionHook'>
+<funcprototype>
+<funcdef>XtActionHookId <function>XtAppAddActionHook</function></funcdef>
+   <paramdef>XtAppContext <parameter>app</parameter></paramdef>
+   <paramdef>XtActionHookProc <parameter>proc</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+<xref linkend='XtAppAddActionHook' xrefstyle='select: title'/>
+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
+<xref linkend='XtCallActionProc' xrefstyle='select: title'/>,
+the action hook procedures will be called in reverse
+order of registration just prior to invoking the action routine.
+</para>
+
+<para>
+Action hook procedures are removed automatically and the
+<function>XtActionHookId is</function>
+destroyed when the application context in which
+they were added is destroyed.
+</para>
+
+<para>
+To remove an action hook procedure without destroying the application
+context, use
+<xref linkend='XtRemoveActionHook' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtRemoveActionHook'>
+<funcprototype>
+<funcdef>void <function>XtRemoveActionHook</function></funcdef>
+   <paramdef>XtActionHookId <parameter>id</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>id</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the action hook id returned by
+<xref linkend='XtAppAddActionHook' xrefstyle='select: title'/>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<xref linkend='XtRemoveActionHook' xrefstyle='select: title'/>
+removes the specified action hook procedure from
+the list in which it was registered.
+</para>
+</sect2>
+</sect1>
+
+<sect1 id="Translation_Tables">
+<title>Translation Tables</title>
+<para>
+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>
+As an example, the default behavior of Pushbutton is
+</para>
+<itemizedlist spacing='compact'>
+  <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>
+The following illustrates Pushbutton's default translation table:
+</para>
+<literallayout >
+static String defaultTranslations =
+       "&lt;EnterWindow&gt;:   Highlight()\\n\\
+       &lt;LeaveWindow&gt;:    Unhighlight()\\n\\
+       &lt;Btn1Down&gt;:       Set()\\n\\
+       &lt;Btn1Up&gt;: Notify() Unset()";
+</literallayout>
+<para>
+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 Intrinsics 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
+<xref linkend='Translation_Table_Management' />.
+</para>
+
+<para>
+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
+<xref linkend='XtParseTranslationTable' xrefstyle='select: title'/>.
+</para>
+
+<para>
+The Intrinsics 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>
+<sect2 id="Event_Sequences">
+<title>Event Sequences</title>
+<para>
+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>
+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>
+</sect2>
+
+<sect2 id="Action_Sequences">
+<title>Action Sequences</title>
+<para>
+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>
+</sect2>
+
+<sect2 id="Multi_Click_Time">
+<title>Multi-Click Time</title>
+<para>
+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
+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
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>.
+If no value is specified, the initial value is 200 milliseconds.
+</para>
+
+<para>
+To set the multi-click time dynamically, use
+<xref linkend='XtSetMultiClickTime' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtSetMultiClickTime'>
+<funcprototype>
+<funcdef>void <function>XtSetMultiClickTime</function></funcdef>
+   <paramdef>Display *<parameter>display</parameter></paramdef>
+   <paramdef>int <parameter>time</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+<xref linkend='XtSetMultiClickTime' xrefstyle='select: title'/>
+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.
+</para>
+
+<para>
+To read the multi-click time, use
+<xref linkend='XtGetMultiClickTime' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtGetMultiClickTime'>
+<funcprototype>
+<funcdef>int <function>XtGetMultiClickTime</function></funcdef>
+   <paramdef>Display *<parameter>display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the display connection.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<xref linkend='XtGetMultiClickTime' xrefstyle='select: title'/>
+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>
+</sect2>
+</sect1>
+
+<sect1 id="Translation_Table_Management">
+<title>Translation Table Management</title>
+<para>
+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>
+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>
+Three Intrinsics functions support this merging:
+</para>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>XtParseTranslationTable</emphasis>
+    </term>
+    <listitem>
+      <para>Compiles a translation table.</para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>XtAugmentTranslations</emphasis>
+    </term>
+    <listitem>
+      <para>Merges a compiled translation table into a widget's
+      compiled translation table, ignoring any new translations that
+      conflict with existing translations.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>XtOverrideTranslations</emphasis>
+    </term>
+    <listitem>
+      <para>Merges a compiled translation table into a widget's
+      compiled translation table, replacing any existing translations that
+      conflict with new translations.
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+To compile a translation table, use
+<xref linkend='XtParseTranslationTable' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtParseTranslationTable'>
+<funcprototype>
+<funcdef>XtTranslations <function>XtParseTranslationTable</function></funcdef>
+   <paramdef>String <parameter>table</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>table</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the translation table to compile.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtParseTranslationTable' xrefstyle='select: title'/>
+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
+<xref linkend='XtParseTranslationTable' xrefstyle='select: title'/>
+and passing an empty string.
+</para>
+
+<para>
+To merge additional translations into an existing translation table, use
+<xref linkend='XtAugmentTranslations' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAugmentTranslations'>
+<funcprototype>
+<funcdef>void <function>XtAugmentTranslations</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>XtTranslations <parameter>translations</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget into which the new translations are to be merged.  Must be of class Core or any subclass thereof.
+      </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>
+The
+<xref linkend='XtAugmentTranslations' xrefstyle='select: title'/>
+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.
+<xref linkend='XtAugmentTranslations' xrefstyle='select: title'/>
+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.
+</para>
+
+<para>
+To overwrite existing translations with new translations, use
+<xref linkend='XtOverrideTranslations' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtOverrideTranslations'>
+<funcprototype>
+<funcdef>void <function>XtOverrideTranslations</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>XtTranslations <parameter>translations</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget into which the new translations are to be merged. Must be of class Core or any subclass thereof.
+      </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>
+The
+<xref linkend='XtOverrideTranslations' xrefstyle='select: title'/>
+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.
+<xref linkend='XtOverrideTranslations' xrefstyle='select: title'/>
+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>
+To replace a widget's translations completely, use
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+on the XtNtranslations resource and specify a compiled translation table
+as the value.
+</para>
+
+<para>
+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>
+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.
+</para>
+
+<para>
+To completely remove existing translations, use
+<xref linkend='XtUninstallTranslations' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtUninstallTranslations'>
+<funcprototype>
+<funcdef>void <function>XtUninstallTranslations</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget from which the translations are to be removed.   Must be of class Core or any subclass thereof.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtUninstallTranslations' xrefstyle='select: title'/>
+function causes the entire translation table for the widget to be removed.
+</para>
+</sect1>
+
+<sect1 id="Using_Accelerators">
+<title>Using Accelerators</title>
+<para>
+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 Intrinsics provide a facility, called accelerators, that lets you
+accomplish this.
+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>
+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
+<xref linkend='XtStringProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtStringProc'>
+<funcprototype>
+<funcdef>typedef void <function>(*XtStringProc)</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>String <parameter>string</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+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.
+</para>
+
+<para>
+To parse an accelerator table, use
+<xref linkend='XtParseAcceleratorTable' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtParseAcceleratorTable'>
+<funcprototype>
+<funcdef>XtAccelerators <function>XtParseAcceleratorTable</function></funcdef>
+   <paramdef>String <parameter>source</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>source</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the accelerator table to compile.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtParseAcceleratorTable' xrefstyle='select: title'/>
+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.
+</para>
+
+<para>
+To install accelerators from a widget on another widget, use
+<xref linkend='XtInstallAccelerators' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtInstallAccelerators'>
+<funcprototype>
+<funcdef>void <function>XtInstallAccelerators</function></funcdef>
+   <paramdef>Widget <parameter>destination</parameter></paramdef>
+   <paramdef>Widget <parameter>source</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>destination</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget on which the accelerators are to be installed.  Must be of class Core or any subclass thereof.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>source</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget from which the accelerators are to come.  Must be of class Core or any subclass thereof.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtInstallAccelerators' xrefstyle='select: title'/>
+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,
+<xref linkend='XtInstallAccelerators' xrefstyle='select: title'/>
+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.
+</para>
+
+<para>
+As a convenience for installing all accelerators from a widget and all its
+descendants onto one destination, use
+<xref linkend='XtInstallAllAccelerators' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtInstallAllAccelerators'>
+<funcprototype>
+<funcdef>void <function>XtInstallAllAccelerators</function></funcdef>
+   <paramdef>Widget <parameter>destination</parameter></paramdef>
+   <paramdef>Widget <parameter>source</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>destination</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget on which the accelerators are to be installed.  Must be of class Core or any subclass thereof.
+      </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.  Must be of class Core or any subclass thereof.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtInstallAllAccelerators' xrefstyle='select: title'/>
+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
+<xref linkend='XtInstallAllAccelerators' xrefstyle='select: title'/>
+and pass the application main window as the source.
+</para>
+</sect1>
+
+<sect1 id="KeyCode_to_KeySym_Conversions">
+<title>KeyCode-to-KeySym Conversions</title>
+<para>
+The translation manager provides support for automatically translating
+KeyCodes in incoming key events into KeySyms.
+KeyCode-to-KeySym translator procedure pointers are of type
+<xref linkend='XtKeyProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtKeyProc'>
+<funcprototype>
+<funcdef>typedef void <function>(*XtKeyProc)</function></funcdef>
+   <paramdef>Display *<parameter>display</parameter></paramdef>
+   <paramdef>KeyCode <parameter>keycode</parameter></paramdef>
+   <paramdef>Modifiers <parameter>modifiers</parameter></paramdef>
+   <paramdef>Modifiers *<parameter>modifiers_return</parameter></paramdef>
+   <paramdef>KeySym *<parameter>keysym_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+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>
+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
+<xref linkend='XtCaseProc' xrefstyle='select: title'/>,
+is installed or a
+<function>MappingNotify</function>
+event is received.
+</para>
+
+<para>
+The Intrinsics 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>
+To return a pointer to the KeySym-to-KeyCode mapping table for a
+particular display, use
+<xref linkend='XtGetKeysymTable' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtGetKeysymTable'>
+<funcprototype>
+<funcdef>KeySym *<function>XtGetKeysymTable</function></funcdef>
+   <paramdef>Display *<parameter>display</parameter></paramdef>
+   <paramdef>KeyCode *<parameter>min_keycode_return</parameter></paramdef>
+   <paramdef>int *<parameter>keysyms_per_keycode_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+<xref linkend='XtGetKeysymTable' xrefstyle='select: title'/>
+returns a pointer to the Intrinsics' 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>
+<literallayout>
+    (test_keycode - min_keycode_return) * keysyms_per_keycode_return
+</literallayout>
+<para>
+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
+<xref linkend='XtGetKeysymTable' xrefstyle='select: title'/>
+each time the value is
+needed, as the table may change prior to dispatching each event.
+</para>
+
+<para>
+For more information on this table, see
+<olink targetdoc='libX11' targetptr='Manipulating_the_Keyboard_Encoding'>Section 12.7</olink> in
+<olink targetdoc='libX11' targetptr='libX11'>Xlib â€” C Language X Interface.</olink>.
+</para>
+
+<para>
+To register a key translator, use
+<xref linkend='XtSetKeyTranslator' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtSetKeyTranslator'>
+<funcprototype>
+<funcdef>void <function>XtSetKeyTranslator</function></funcdef>
+   <paramdef>Display *<parameter>display</parameter></paramdef>
+   <paramdef>XtKeyProc <parameter>proc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtSetKeyTranslator' xrefstyle='select: title'/>
+function sets the specified procedure as the current key translator.
+The default translator is
+<function>XtTranslateKey</function>,
+an
+<xref linkend='XtKeyProc' xrefstyle='select: title'/>
+that uses the Shift, Lock, numlock, and group modifiers
+with the interpretations defined in <emphasis remap='I'>X Window System Protocol</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.
+</para>
+
+<para>
+To invoke the currently registered KeyCode-to-KeySym translator,
+use
+<xref linkend='XtTranslateKeycode' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtTranslateKeycode'>
+<funcprototype>
+<funcdef>void <function>XtTranslateKeycode</function></funcdef>
+   <paramdef>Display *<parameter>display</parameter></paramdef>
+   <paramdef>KeyCode <parameter>keycode</parameter></paramdef>
+   <paramdef>Modifiers <parameter>modifiers</parameter></paramdef>
+   <paramdef>Modifiers *<parameter>modifiers_return</parameter></paramdef>
+   <paramdef>KeySym *<parameter>keysym_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtTranslateKeycode' xrefstyle='select: title'/>
+function passes the specified arguments
+directly to the currently registered KeyCode-to-KeySym translator.
+</para>
+
+<para>
+To handle capitalization of nonstandard KeySyms, the Intrinsics allow
+clients to register case conversion routines.
+Case converter procedure pointers are of type
+<xref linkend='XtCaseProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtCaseProc'>
+<funcprototype>
+<funcdef>typedef void <function>(*XtCaseProc)</function></funcdef>
+   <paramdef>Display *<parameter>display</parameter></paramdef>
+   <paramdef>KeySym <parameter>keysym</parameter></paramdef>
+   <paramdef>KeySym *<parameter>lower_return</parameter></paramdef>
+   <paramdef>KeySym *<parameter>upper_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+If there is no case distinction,
+this procedure should store the KeySym into both return values.
+</para>
+
+<para>
+To register a case converter, use
+<xref linkend='XtRegisterCaseConverter' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtRegisterCaseConverter'>
+<funcprototype>
+<funcdef>void <function>XtRegisterCaseConverter</function></funcdef>
+   <paramdef>Display *<parameter>display</parameter></paramdef>
+   <paramdef>XtCaseProc <parameter>proc</parameter></paramdef>
+   <paramdef>KeySym <parameter>start</parameter></paramdef>
+   <paramdef>KeySym <parameter>stop</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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
+<xref linkend='XtCaseProc' xrefstyle='select: title'/>
+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>
+The
+<xref linkend='XtRegisterCaseConverter' xrefstyle='select: title'/>
+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 Intrinsics  refresh the keyboard state if necessary.
+The default converter understands case conversion for all
+Latin KeySyms defined in <emphasis remap='I'>X Window System Protocol</emphasis>, Appendix A.
+</para>
+
+<para>
+To determine uppercase and lowercase equivalents for a KeySym, use
+<xref linkend='XtConvertCase' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtConvertCase'>
+<funcprototype>
+<funcdef>void <function>XtConvertCase</function></funcdef>
+   <paramdef>Display *<parameter>display</parameter></paramdef>
+   <paramdef>KeySym <parameter>keysym</parameter></paramdef>
+   <paramdef>KeySym *<parameter>lower_return</parameter></paramdef>
+   <paramdef>KeySym *<parameter>upper_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtConvertCase' xrefstyle='select: title'/>
+function calls the appropriate converter and returns the results.
+A user-supplied
+<xref linkend='XtKeyProc' xrefstyle='select: title'/>
+may need to use this function.
+</para>
+</sect1>
+
+<sect1 id="Obtaining_a_KeySym_in_an_Action_Procedure">
+<title>Obtaining a KeySym in an Action Procedure</title>
+<para>
+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
+Intrinsics 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>
+To retrieve the KeySym and modifiers that matched the final event
+specification in the translation table entry, use
+<xref linkend='XtGetActionKeysym' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtGetActionKeysym'>
+<funcprototype>
+<funcdef>KeySym <function>XtGetActionKeysym</function></funcdef>
+   <paramdef>XEvent *<parameter>event</parameter></paramdef>
+   <paramdef>Modifiers *<parameter>modifiers_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the event pointer passed to the action procedure by the Intrinsics.
+      </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>
+If
+<xref linkend='XtGetActionKeysym' xrefstyle='select: title'/>
+is called after an action procedure has been
+invoked by the Intrinsics 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
+<xref linkend='XtGetActionKeysym' xrefstyle='select: title'/>
+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
+<xref linkend='XtGetActionKeysym' xrefstyle='select: title'/>
+calls
+<xref linkend='XtTranslateKeycode' xrefstyle='select: title'/>
+and returns the results;
+else it returns
+<function>NoSymbol</function>
+and does not examine <emphasis remap='I'>modifiers_return</emphasis>.
+</para>
+
+<para>
+Note that if an action procedure invoked by the Intrinsics
+invokes a subsequent action procedure (and so on) via
+<xref linkend='XtCallActionProc' xrefstyle='select: title'/>,
+the nested action procedure may also call
+<xref linkend='XtGetActionKeysym' xrefstyle='select: title'/>
+to retrieve the Intrinsics' KeySym and modifiers.
+</para>
+</sect1>
+
+<sect1 id="KeySym_to_KeyCode_Conversions">
+<title>KeySym-to-KeyCode Conversions</title>
+<para>
+To return the list of KeyCodes that map to a particular KeySym in
+the keyboard mapping table maintained by the Intrinsics, use
+<xref linkend='XtKeysymToKeycodeList' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtKeysymToKeycodeList'>
+<funcprototype>
+<funcdef>void <function>XtKeysymToKeycodeList</function></funcdef>
+   <paramdef>Display *<parameter>display</parameter></paramdef>
+   <paramdef>KeySym <parameter>keysym</parameter></paramdef>
+   <paramdef>KeyCode **<parameter>keycodes_return</parameter></paramdef>
+   <paramdef>Cardinal *<parameter>keycount_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtKeysymToKeycodeList' xrefstyle='select: title'/>
+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'>X Window System Protocol</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>
+The caller should free the storage pointed to by <emphasis remap='I'>keycodes_return</emphasis> using
+<xref linkend='XtFree' xrefstyle='select: title'/>
+when it is no longer useful.  If the caller needs to examine
+the KeyCode-to-KeySym table for a particular KeyCode, it should call
+<xref linkend='XtGetKeysymTable' xrefstyle='select: title'/>.
+</para>
+</sect1>
+
+<sect1 id="Registering_Button_and_Key_Grabs_for_Actions">
+<title>Registering Button and Key Grabs for Actions</title>
+<para>
+To register button and key grabs for a widget's window according to the
+event bindings in the widget's translation table, use
+<xref linkend='XtRegisterGrabAction' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtRegisterGrabAction'>
+<funcprototype>
+<funcdef>void <function>XtRegisterGrabAction</function></funcdef>
+   <paramdef>XtActionProc <parameter>action_proc</parameter></paramdef>
+   <paramdef>Boolean <parameter>owner_events</parameter></paramdef>
+   <paramdef>unsigned int <parameter>event_mask</parameter></paramdef>
+   <paramdef>int <parameter>pointer_mode</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>action_proc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the action procedure to search for in translation tables.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>owner_events</emphasis>
+    </term>
+    <listitem>
+      <para></para>
+      
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event_mask</emphasis>
+    </term>
+    <listitem>
+      <para></para>
+      
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>pointer_mode</emphasis>
+    </term>
+    <listitem>
+      <para></para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keyboard_mode</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify arguments to
+<xref linkend='XtGrabButton' xrefstyle='select: title'/>
+or
+<xref linkend='XtGrabKey' xrefstyle='select: title'/>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<xref linkend='XtRegisterGrabAction' xrefstyle='select: title'/>
+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 Intrinsics will call
+<xref linkend='XtGrabButton' xrefstyle='select: title'/>
+or
+<xref linkend='XtGrabKey' xrefstyle='select: title'/>
+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
+<xref linkend='XtGrabKey' xrefstyle='select: title'/>
+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>
+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>
+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
+<xref linkend='XtGrabKey' xrefstyle='select: title'/>
+or
+<xref linkend='XtGrabButton' xrefstyle='select: title'/>.
+</para>
+</sect1>
+
+<sect1 id="Invoking_Actions_Directly">
+<title>Invoking Actions Directly</title>
+<para>
+Normally action procedures are invoked by the Intrinsics when an
+event or event sequence arrives for a widget. To
+invoke an action procedure directly, without generating
+(or synthesizing) events, use
+<xref linkend='XtCallActionProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtCallActionProc'>
+<funcprototype>
+<funcdef>void <function>XtCallActionProc</function></funcdef>
+   <paramdef>Widget <parameter>widget</parameter></paramdef>
+   <paramdef>String <parameter>action</parameter></paramdef>
+   <paramdef>XEvent *<parameter>event</parameter></paramdef>
+   <paramdef>String *<parameter>params</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_params</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>widget</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget in which the action is to be invoked.  Must be of class Core or any subclass thereof.
+      </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>
+<xref linkend='XtCallActionProc' xrefstyle='select: title'/>
+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
+<xref linkend='XtCallActionProc' xrefstyle='select: title'/>.
+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,
+<xref linkend='XtCallActionProc' xrefstyle='select: title'/>
+generates a warning message and returns.
+</para>
+</sect1>
+
+<sect1 id="Obtaining_a_Widget_s_Action_List">
+<title>Obtaining a Widget's Action List</title>
+<para>
+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
+<xref linkend='XtGetActionList' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtGetActionList'>
+<funcprototype>
+<funcdef>void <function>XtGetActionList</function></funcdef>
+   <paramdef>WidgetClass <parameter>widget_class</parameter></paramdef>
+   <paramdef>XtActionList *<parameter>actions_return</parameter></paramdef>
+   <paramdef>Cardinal *<parameter>num_actions_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+<xref linkend='XtGetActionList' xrefstyle='select: title'/>
+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
+<xref linkend='XtFree' xrefstyle='select: title'/>
+when it is no longer needed.
+</para>
+</sect1>
+</chapter>
diff --git a/specs/CH11.xml b/specs/CH11.xml
new file mode 100644 (file)
index 0000000..92e46dc
--- /dev/null
@@ -0,0 +1,5538 @@
+<chapter id='Utility_Functions'>
+<title>Utility Functions</title>
+<para>
+The Intrinsics provide a number of utility functions that you can use to
+</para>
+<itemizedlist spacing='compact'>
+  <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>
+
+<sect1 id="Determining_the_Number_of_Elements_in_an_Array">
+<title>Determining the Number of Elements in an Array</title>
+<para>
+To determine the number of elements in a fixed-size array, use
+<xref linkend='XtNumber' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtNumber'>
+<funcprototype>
+<funcdef>Cardinal <function>XtNumber</function></funcdef>
+  <paramdef>ArrayType <parameter>array</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>array</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a fixed-size array of arbitrary type.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtNumber' xrefstyle='select: title'/>
+macro returns the number of elements allocated to the array.
+</para>
+</sect1>
+
+<sect1 id="Translating_Strings_to_Widget_Instances">
+<title>Translating Strings to Widget Instances</title>
+<para>
+To translate a widget name to a widget instance, use
+<xref linkend='XtNameToWidget' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtNameToWidget'>
+<funcprototype>
+<funcdef>Widget <function>XtNameToWidget</function></funcdef>
+   <paramdef>Widget <parameter>reference</parameter></paramdef>
+   <paramdef>String <parameter>names</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>reference</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget from which the search is to start.  Must be of class Core or any subclass thereof.
+      </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>
+The
+<xref linkend='XtNameToWidget' xrefstyle='select: title'/>
+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.
+<xref linkend='XtNameToWidget' xrefstyle='select: title'/>
+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 spacing='compact'>
+  <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>
+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 Intrinsics do not require that all
+children of a widget have unique names,
+<xref linkend='XtNameToWidget' xrefstyle='select: title'/>
+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>
+</sect1>
+
+<sect1 id="Managing_Memory_Usage">
+<title>Managing Memory Usage</title>
+<para>
+The Intrinsics 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 spacing='compact'>
+  <listitem>
+    <para>
+<xref linkend='XtMalloc' xrefstyle='select: title'/>,
+<xref linkend='XtCalloc' xrefstyle='select: title'/>,
+and
+<xref linkend='XtRealloc' xrefstyle='select: title'/>
+give an error if there is not enough memory.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtFree' xrefstyle='select: title'/>
+simply returns if passed a NULL pointer.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtRealloc' xrefstyle='select: title'/>
+simply allocates new storage if passed a NULL pointer.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+See the standard C library documentation on
+<function>malloc</function>,
+<function>calloc</function>,
+<function>realloc</function>,
+and
+<function>free</function>
+for more information.
+</para>
+
+<para>
+To allocate storage, use
+<xref linkend='XtMalloc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtMalloc'>
+<funcprototype>
+<funcdef>char * <function>XtMalloc</function></funcdef>
+   <paramdef>Cardinal <parameter>size</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>size</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of bytes desired.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtMalloc' xrefstyle='select: title'/>
+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,
+<xref linkend='XtMalloc' xrefstyle='select: title'/>
+calls
+<xref linkend='XtErrorMsg' xrefstyle='select: title'/>.
+</para>
+
+<para>
+To allocate and initialize an array, use
+<xref linkend='XtCalloc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtCalloc'>
+<funcprototype>
+<funcdef>char * <function>XtCalloc</function></funcdef>
+   <paramdef>Cardinal <parameter>num</parameter></paramdef>
+   <paramdef>Cardinal <parameter>size</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtCalloc' xrefstyle='select: title'/>
+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,
+<xref linkend='XtCalloc' xrefstyle='select: title'/>
+calls
+<xref linkend='XtErrorMsg' xrefstyle='select: title'/>.
+<xref linkend='XtCalloc' xrefstyle='select: title'/>
+returns the address of the allocated storage.
+</para>
+
+<para>
+To change the size of an allocated block of storage, use
+<xref linkend='XtRealloc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtRealloc'>
+<funcprototype>
+<funcdef>char *<function>XtRealloc</function></funcdef>
+   <paramdef>char *<parameter>ptr</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ptr</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a pointer to the old storage allocated with
+<xref linkend='XtMalloc' xrefstyle='select: title'/>,
+<xref linkend='XtCalloc' xrefstyle='select: title'/>,
+or
+<xref linkend='XtRealloc' xrefstyle='select: title'/>,
+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>
+The
+<xref linkend='XtRealloc' xrefstyle='select: title'/>
+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,
+<xref linkend='XtRealloc' xrefstyle='select: title'/>
+calls
+<xref linkend='XtErrorMsg' xrefstyle='select: title'/>.
+If <emphasis remap='I'>ptr</emphasis> is NULL,
+<xref linkend='XtRealloc' xrefstyle='select: title'/>
+simply calls
+<xref linkend='XtMalloc' xrefstyle='select: title'/>.
+<xref linkend='XtRealloc' xrefstyle='select: title'/>
+then returns the address of the new block.
+</para>
+
+<para>
+To free an allocated block of storage, use
+<xref linkend='XtFree' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtFree'>
+<funcprototype>
+<funcdef>void <function>XtFree</function></funcdef>
+   <paramdef>char *<parameter>ptr</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ptr</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a pointer to a block of storage allocated with
+<xref linkend='XtMalloc' xrefstyle='select: title'/>,
+<xref linkend='XtCalloc' xrefstyle='select: title'/>,
+or
+<xref linkend='XtRealloc' xrefstyle='select: title'/>,
+or NULL.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtFree' xrefstyle='select: title'/>
+function returns storage, allowing it to be reused.
+If <emphasis remap='I'>ptr</emphasis> is NULL,
+<xref linkend='XtFree' xrefstyle='select: title'/>
+returns immediately.
+</para>
+
+<para>
+To allocate storage for a new instance of a type, use
+<xref linkend='XtNew' xrefstyle='select: title'/>.
+</para>
+
+
+<funcsynopsis id='XtNew'>
+<funcprototype>
+<funcdef>type <function>XtNew</function></funcdef>
+      <paramdef>type <parameter>t</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>type</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a previously declared type.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<xref linkend='XtNew' xrefstyle='select: title'/>
+returns a pointer to the allocated storage.
+If there is insufficient memory to allocate the new block,
+<xref linkend='XtNew' xrefstyle='select: title'/>
+calls
+<xref linkend='XtErrorMsg' xrefstyle='select: title'/>.
+<xref linkend='XtNew' xrefstyle='select: title'/>
+is a convenience macro that calls
+<xref linkend='XtMalloc' xrefstyle='select: title'/>
+with the following arguments specified:
+</para>
+<literallayout >
+((type *) XtMalloc((unsigned) sizeof(type)))
+</literallayout>
+<para>
+The storage allocated by
+<xref linkend='XtNew' xrefstyle='select: title'/>
+should be freed using
+<xref linkend='XtFree' xrefstyle='select: title'/>.
+</para>
+
+<para>
+To copy an instance of a string, use
+<xref linkend='XtNewString' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtNewString'>
+<funcprototype>
+<funcdef>String <function>XtNewString</function></funcdef>
+   <paramdef>String <parameter>string</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>string</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a previously declared string.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<xref linkend='XtNewString' xrefstyle='select: title'/>
+returns a pointer to the allocated storage.
+If there is insufficient memory to allocate the new block,
+<xref linkend='XtNewString' xrefstyle='select: title'/>
+calls
+<xref linkend='XtErrorMsg' xrefstyle='select: title'/>.
+<xref linkend='XtNewString' xrefstyle='select: title'/>
+is a convenience macro that calls
+<xref linkend='XtMalloc' xrefstyle='select: title'/>
+with the following arguments specified:
+</para>
+<literallayout >
+(strcpy(XtMalloc((unsigned)strlen(str) + 1), str))
+</literallayout>
+<para>
+The storage allocated by
+<xref linkend='XtNewString' xrefstyle='select: title'/>
+should be freed using
+<xref linkend='XtFree' xrefstyle='select: title'/>.
+</para>
+</sect1>
+
+<sect1 id="Sharing_Graphics_Contexts">
+<title>Sharing Graphics Contexts</title>
+<para>
+The Intrinsics 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>
+To obtain a shareable GC with modifiable fields, use
+<xref linkend='XtAllocateGC' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAllocateGC'>
+<funcprototype>
+<funcdef>GC <function>XtAllocateGC</function></funcdef>
+   <paramdef>Widget <parameter>object</parameter></paramdef>
+   <paramdef>Cardinal <parameter>depth</parameter></paramdef>
+   <paramdef>XtGCMask <parameter>value_mask</parameter></paramdef>
+   <paramdef>XGCValues *<parameter>values</parameter></paramdef>
+   <paramdef>XtGCMask <parameter>dynamic_mask</parameter></paramdef>
+   <paramdef>XtGCMask <parameter>unused_mask</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>object</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies an object, giving the screen for which the
+returned GC is valid.  Must be of class Object or any subclass thereof.
+      </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>
+The
+<xref linkend='XtAllocateGC' xrefstyle='select: title'/>
+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>
+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>
+<xref linkend='XtAllocateGC' xrefstyle='select: title'/>
+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.
+<xref linkend='XtAllocateGC' xrefstyle='select: title'/>
+may modify and return an existing GC if it was allocated with a
+nonzero <emphasis remap='I'>unused_mask</emphasis>.
+</para>
+
+<para>
+To obtain a shareable GC with no modifiable fields, use
+<xref linkend='XtGetGC' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtGetGC'>
+<funcprototype>
+<funcdef>GC <function>XtGetGC</function></funcdef>
+   <paramdef>Widget <parameter>object</parameter></paramdef>
+   <paramdef>XtGCMask <parameter>value_mask</parameter></paramdef>
+   <paramdef>XGCValues *<parameter>values</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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.  Must be of class Object or any subclass thereof.
+      </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>
+The
+<xref linkend='XtGetGC' xrefstyle='select: title'/>
+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.
+<xref linkend='XtGetGC' xrefstyle='select: title'/>
+is equivalent to
+<xref linkend='XtAllocateGC' xrefstyle='select: title'/>
+with <emphasis remap='I'>depth</emphasis>, <emphasis remap='I'>dynamic_mask</emphasis>, and <emphasis remap='I'>unused_mask</emphasis> all zero.
+</para>
+
+<para>
+<xref linkend='XtGetGC' xrefstyle='select: title'/>
+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.
+</para>
+
+<para>
+To deallocate a shared GC when it is no longer needed, use
+<xref linkend='XtReleaseGC' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtReleaseGC'>
+<funcprototype>
+<funcdef>void <function>XtReleaseGC</function></funcdef>
+   <paramdef>Widget <parameter>object</parameter></paramdef>
+   <paramdef>GC <parameter>gc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>object</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies any object on the Display for which the GC was created.  Must be of class Object or any subclass thereof.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the shared GC obtained with either
+<xref linkend='XtAllocateGC' xrefstyle='select: title'/>
+or
+<xref linkend='XtGetGC' xrefstyle='select: title'/>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+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>
+</sect1>
+
+<sect1 id="Managing_Selections">
+<title>Managing Selections</title>
+<para>
+Arbitrary widgets in multiple applications can communicate
+with each other by means of the Intrinsics global selection mechanism,
+which conforms to the specifications in the <emphasis remap='I'>Inter-Client Communication Conventions Manual.</emphasis>.
+The Intrinsics supply functions for providing and receiving selection data in
+one logical piece (atomic transfers)
+or in smaller logical segments (incremental transfers).
+</para>
+
+<para>
+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 Intrinsics 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 Intrinsics is not
+required to match the underlying
+transport protocol between the application and the X server;
+the Intrinsics 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>
+
+<sect2 id='Setting_and_Getting_the_Selection_Timeout_Value'>
+<title>Setting and Getting the Selection Timeout Value</title>
+<para>
+To set the Intrinsics selection timeout, use
+<xref linkend='XtAppSetSelectionTimeout' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppSetSelectionTimeout'>
+<funcprototype>
+<funcdef>void <function>XtAppSetSelectionTimeout</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+   <paramdef>unsigned long <parameter>timeout</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+To get the current selection timeout value, use
+<xref linkend='XtAppGetSelectionTimeout' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppGetSelectionTimeout'>
+<funcprototype>
+<funcdef>unsigned long <function>XtAppGetSelectionTimeout</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>app_context</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the application context.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtAppGetSelectionTimeout' xrefstyle='select: title'/>
+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
+application resource as retrieved by
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>.
+If
+selectionTimeout
+is not specified,
+the default is five seconds.
+</para>
+</sect2>
+
+<sect2 id="Using_Atomic_Transfers">
+<title>Using Atomic Transfers</title>
+<para>
+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>
+
+<sect3 id="Atomic_Transfer_Procedures">
+<title>Atomic Transfer Procedures</title>
+<para>
+The following procedures are used by the selection owner when
+providing selection data in a single unit.
+</para>
+
+<para>
+The procedure pointer specified by the owner to supply the selection
+data to the Intrinsics is of type
+<xref linkend='XtConvertSelectionProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtConvertSelectionProc'>
+<funcprototype>
+<funcdef>typedef Boolean <function>(*XtConvertSelectionProc)</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>Atom *<parameter>selection</parameter></paramdef>
+   <paramdef>Atom *<parameter>target</parameter></paramdef>
+   <paramdef>Atom *<parameter>type_return</parameter></paramdef>
+   <paramdef>XtPointer *<parameter>value_return</parameter></paramdef>
+   <paramdef>unsigned long *<parameter>length_return</parameter></paramdef>
+   <paramdef>int *<parameter>format_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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
+<xref linkend='XtSelectionDoneProc' xrefstyle='select: title'/>
+for the selection,
+this storage is owned by the selection owner;
+otherwise, it is owned by the Intrinsics selection mechanism,
+which frees it by calling
+<xref linkend='XtFree' xrefstyle='select: title'/>
+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>
+This procedure is called by the Intrinsics 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
+<xref linkend='XtConvertSelectionProc' xrefstyle='select: title'/>
+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>
+This procedure does not need to worry about responding to the
+MULTIPLE or the TIMESTAMP target values (see
+<xref linkend='Window_Creation_Convenience_Routine' />
+in the <olink targetdoc='icccm' targetptr='icccm'>Inter-Client Communication Conventions Manual.</olink>).
+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 Intrinsics using the time specified in the
+call to
+<xref linkend='XtOwnSelection' xrefstyle='select: title'/>
+or
+<xref linkend='XtOwnSelectionIncremental' xrefstyle='select: title'/>.
+</para>
+
+<para>
+To retrieve the
+<function>SelectionRequest</function>
+event that triggered the
+<xref linkend='XtConvertSelectionProc' xrefstyle='select: title'/>
+procedure, use
+<xref linkend='XtGetSelectionRequest' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtGetSelectionRequest'>
+<funcprototype>
+<funcdef>XSelectionRequestEvent *<function>XtGetSelectionRequest</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>Atom <parameter>selection</parameter></paramdef>
+   <paramdef>XtRequestId <parameter>request_id</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget that currently owns this selection.  Must be of class Core or any subclass thereof.
+      </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>
+<xref linkend='XtGetSelectionRequest' xrefstyle='select: title'/>
+may be called only from within an
+<xref linkend='XtConvertSelectionProc' xrefstyle='select: title'/>
+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>,
+<xref linkend='XtGetSelectionRequest' xrefstyle='select: title'/>
+returns NULL.
+</para>
+
+<para>
+The procedure pointer specified by the owner when it desires
+notification upon losing ownership is of type
+<xref linkend='XtLoseSelectionProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtLoseSelectionProc'>
+<funcprototype>
+<funcdef>typedef void <function>(*XtLoseSelectionProc)</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>Atom *<parameter>selection</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+This procedure is called by the Intrinsics 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.
+</para>
+
+<para>
+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
+<xref linkend='XtSelectionDoneProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtSelectionDoneProc'>
+<funcprototype>
+<funcdef>typedef void <function>(*XtSelectionDoneProc)</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>Atom *<parameter>selection</parameter></paramdef>
+   <paramdef>Atom *<parameter>target</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+This procedure is called by the Intrinsics selection mechanism
+to inform the selection owner that a selection requestor has successfully
+retrieved a selection value.
+If the selection owner has registered an
+<xref linkend='XtSelectionDoneProc' xrefstyle='select: title'/>,
+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
+<xref linkend='XtSelectionDoneProc' xrefstyle='select: title'/>,
+it also owns the storage containing the converted
+selection value.
+</para>
+</sect3>
+<sect3 id="Getting_the_Selection_Value">
+<title>Getting the Selection Value</title>
+<para>
+The procedure pointer specified by the requestor to receive the
+selection data from the Intrinsics is of type
+<xref linkend='XtSelectionCallbackProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtSelectionCallbackProc'>
+<funcprototype>
+<funcdef>typedef void <function>(*XtSelectionCallbackPro)</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+   <paramdef>Atom *<parameter>selection</parameter></paramdef>
+   <paramdef>Atom *<parameter>type</parameter></paramdef>
+   <paramdef>XtPointer <parameter>value</parameter></paramdef>
+   <paramdef>unsigned long *<parameter>length</parameter></paramdef>
+   <paramdef>int *<parameter>format</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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 Intrinsics 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
+<xref linkend='XtFree' xrefstyle='select: title'/>
+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>
+This procedure is called by the Intrinsics selection mechanism to deliver the
+requested selection to the requestor.
+</para>
+
+<para>
+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.
+</para>
+
+<para>
+To obtain the selection value in a single logical unit, use
+<xref linkend='XtGetSelectionValue' xrefstyle='select: title'/>
+or
+<xref linkend='XtGetSelectionValues' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtGetSelectionValue'>
+<funcprototype>
+<funcdef>void <function>XtGetSelectionValue</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>Atom <parameter>selection</parameter></paramdef>
+   <paramdef>Atom <parameter>target</parameter></paramdef>
+   <paramdef>XtSelectionCallbackProc <parameter>callback</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+   <paramdef>Time <parameter>time</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget making the request.  Must be of class Core or any subclass thereof.
+      </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>
+The
+<xref linkend='XtGetSelectionValue' xrefstyle='select: title'/>
+function requests the value of the selection converted to
+the target type.
+The specified callback is called at some time after
+<xref linkend='XtGetSelectionValue' xrefstyle='select: title'/>
+is called, when the selection value is received from the X server.
+It may be called before or after
+<xref linkend='XtGetSelectionValue' xrefstyle='select: title'/>
+returns.
+For more information about <emphasis remap='I'>selection</emphasis>,
+<emphasis remap='I'>target</emphasis>, and
+<emphasis remap='I'>time</emphasis>, see
+<olink targetdoc='icccm' targetptr='Use_of_Selection_Atoms'>Section 2.6</olink> in the
+<olink targetdoc='icccm' targetptr='icccm'>Inter-Client Communication Conventions Manual.</olink>.
+</para>
+
+<funcsynopsis id='XtGetSelectionValues'>
+<funcprototype>
+<funcdef>void <function>XtGetSelectionValues</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>Atom <parameter>selection</parameter></paramdef>
+   <paramdef>Atom *<parameter>targets</parameter></paramdef>
+   <paramdef>int <parameter>count</parameter></paramdef>
+   <paramdef>XtSelectionCallbackProc <parameter>callback</parameter></paramdef>
+   <paramdef>XtPointer *<parameter>client_data</parameter></paramdef>
+   <paramdef>Time <parameter>time</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget making the request.  Must be of class Core or any subclass thereof.
+      </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>
+The
+<xref linkend='XtGetSelectionValues' xrefstyle='select: title'/>
+function is similar to multiple calls to
+<xref linkend='XtGetSelectionValue' xrefstyle='select: title'/>
+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
+<olink targetdoc='icccm' targetptr='Use_of_Selection_Atoms'>section 2.6</olink>
+in the <emphasis remap='I'>Inter-Client Communication Conventions Manual.</emphasis>.
+</para>
+</sect3>
+<sect3 id="Setting_the_Selection_Owner">
+<title>Setting the Selection Owner</title>
+<para>
+To set the selection owner and indicate that the selection value will
+be provided in one piece, use
+<xref linkend='XtOwnSelection' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtOwnSelection'>
+<funcprototype>
+<funcdef>Boolean <function>XtOwnSelection</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>Atom <parameter>selection</parameter></paramdef>
+   <paramdef>Time <parameter>time</parameter></paramdef>
+   <paramdef>XtConvertSelectionProc <parameter>convert_proc</parameter></paramdef>
+   <paramdef>XtLoseSelectionProc <parameter>lose_selection</parameter></paramdef>
+   <paramdef>XtSelectionDoneProc <parameter>done_proc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget that wishes to become the owner.  Must be of class Core or any subclass thereof.
+      </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>
+The
+<xref linkend='XtOwnSelection' xrefstyle='select: title'/>
+function informs the Intrinsics 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>
+If a done_proc is specified, the client owns the storage allocated
+for passing the value to the Intrinsics.  If <emphasis remap='I'>done_proc</emphasis> is NULL,
+the convert_proc must allocate storage using
+<xref linkend='XtMalloc' xrefstyle='select: title'/>,
+<xref linkend='XtRealloc' xrefstyle='select: title'/>,
+or
+<xref linkend='XtCalloc' xrefstyle='select: title'/>,
+and the value specified is freed by the
+Intrinsics when the transfer is complete.
+</para>
+
+<para>
+Usually, a selection owner maintains ownership indefinitely until some
+other widget requests ownership, at which time
+the Intrinsics 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 Intrinsics
+by using
+<xref linkend='XtDisownSelection' xrefstyle='select: title'/>
+that it no longer is to be the selection owner.
+</para>
+
+<funcsynopsis id='XtDisownSelection'>
+<funcprototype>
+<funcdef>void <function>XtDisownSelection</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>Atom <parameter>selection</parameter></paramdef>
+   <paramdef>Time <parameter>time</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtDisownSelection' xrefstyle='select: title'/>
+function informs the Intrinsics 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,
+<xref linkend='XtDisownSelection' xrefstyle='select: title'/>
+does nothing.
+</para>
+
+<para>
+After a widget has called
+<xref linkend='XtDisownSelection' xrefstyle='select: title'/>,
+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
+<xref linkend='XtDisownSelection' xrefstyle='select: title'/>
+finishes after the call to
+<xref linkend='XtDisownSelection' xrefstyle='select: title'/>.
+</para>
+</sect3>
+</sect2>
+
+<sect2 id="Using_Incremental_Transfers">
+<title>Using Incremental Transfers</title>
+<para>
+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>
+For example, consider the following:
+</para>
+<itemizedlist spacing='compact'>
+  <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>
+<sect3 id="Incremental_Transfer_Procedures">
+<title>Incremental Transfer Procedures</title>
+<para>
+The following procedures are used by selection owners who wish to
+provide the selection data in multiple segments.
+</para>
+
+<para>
+The procedure pointer specified by the incremental owner to supply the
+selection data to the Intrinsics is of type
+<xref linkend='XtConvertSelectionIncrProc' xrefstyle='select: title'/>.
+</para>
+<literallayout >
+typedef XtPointer XtRequestId;
+</literallayout>
+
+<funcsynopsis id='XtConvertSelectionIncrProc'>
+<funcprototype>
+<funcdef>typedef Boolean <function>(*XtConvertSelectionIncrProc)</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>Atom *<parameter>selection</parameter></paramdef>
+   <paramdef>Atom *<parameter>target</parameter></paramdef>
+   <paramdef>Atom *<parameter>type_return</parameter></paramdef>
+   <paramdef>XtPointer *<parameter>value_return</parameter></paramdef>
+   <paramdef>unsigned long *<parameter>length_return</parameter></paramdef>
+   <paramdef>int *<parameter>format_return</parameter></paramdef>
+   <paramdef>unsigned long *<parameter>max_length</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+   <paramdef>XtRequestId *<parameter>request_id</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+This procedure is called repeatedly by the Intrinsics selection mechanism to get
+the next incremental chunk of data from a selection owner who has
+called
+<xref linkend='XtOwnSelectionIncremental' xrefstyle='select: title'/>.
+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 Intrinsics;
+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 Intrinsics to begin a
+new transfer.
+</para>
+
+<para>
+To retrieve the
+<function>SelectionRequest</function>
+event that triggered the selection conversion procedure, use
+<xref linkend='XtGetSelectionRequest' xrefstyle='select: title'/>,
+described in Section 11.5.2.1.
+</para>
+
+<para>
+The procedure pointer specified by the incremental selection owner
+when it desires notification upon no longer having ownership is of
+type
+<xref linkend='XtLoseSelectionIncrProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtLoseSelectionIncrProc'>
+<funcprototype>
+<funcdef>typedef void <function>(*XtLoseSelectionIncrProc)</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>Atom *<parameter>selection</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+This procedure, which is optional, is called by the Intrinsics to
+inform the selection owner that it no longer owns the selection.
+</para>
+
+<para>
+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
+<xref linkend='XtSelectionDoneIncrProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtSelectionDoneIncrProc'>
+<funcprototype>
+<funcdef>typedef void <function>(*XtSelectionDoneIncrProc)</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>Atom *<parameter>selection</parameter></paramdef>
+   <paramdef>Atom *<parameter>target</parameter></paramdef>
+   <paramdef>XtRequestId *<parameter>request_id</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+This procedure, which is optional, is called by the Intrinsics 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 Intrinsics will free only the
+final value returned by the selection owner using
+<xref linkend='XtFree' xrefstyle='select: title'/>.
+</para>
+
+<para>
+The procedure pointer specified by the incremental selection owner to
+notify it if a transfer should be terminated prematurely is of type
+<xref linkend='XtCancelConvertSelectionProc' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtCancelConvertSelectionProc'>
+<funcprototype>
+<funcdef>typedef void <function>(*XtCancelConvertSelectionProc)</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>Atom *<parameter>selection</parameter></paramdef>
+   <paramdef>Atom *<parameter>target</parameter></paramdef>
+   <paramdef>XtRequestId *<parameter>request_id</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+This procedure is called by the Intrinsics 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>
+</sect3>
+<sect3 id="Getting_the_Selection_Value_Incrementally">
+<title>Getting the Selection Value Incrementally</title>
+<para>
+To obtain the value of the selection using incremental transfers, use
+<xref linkend='XtGetSelectionValueIncremental' xrefstyle='select: title'/>
+or
+<xref linkend='XtGetSelectionValuesIncremental' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtGetSelectionValueIncremental'>
+<funcprototype>
+<funcdef>void <function>XtGetSelectionValueIncremental</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>Atom <parameter>selection</parameter></paramdef>
+   <paramdef>Atom <parameter>target</parameter></paramdef>
+   <paramdef>XtSelectionCallbackProc <parameter>selection_callback</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+   <paramdef>Time <parameter>time</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget making the request.  Must be of class Core or any subclass thereof.
+      </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>
+The
+<xref linkend='XtGetSelectionValueIncremental' xrefstyle='select: title'/>
+function is similar to
+<xref linkend='XtGetSelectionValue' xrefstyle='select: title'/>
+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 
+<olink targetdoc='icccm' targetptr='Use_of_Selection_Atoms' /> in the
+<olink targetdoc='icccm' targetptr='icccm'>Inter-Client Communication Conventions Manual.</olink>
+</para>
+
+<funcsynopsis id='XtGetSelectionValuesIncremental'>
+<funcprototype>
+<funcdef>void <function>XtGetSelectionValuesIncremental</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>Atom <parameter>selection</parameter></paramdef>
+   <paramdef>Atom *<parameter>targets</parameter></paramdef>
+   <paramdef>int <parameter>count</parameter></paramdef>
+   <paramdef>XtSelectionCallbackProc <parameter>selection_callback</parameter></paramdef>
+   <paramdef>XtPointer *<parameter>client_data</parameter></paramdef>
+   <paramdef>Time <parameter>time</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget making the request.  Must be of class Core or any subclass thereof.
+      </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>
+The
+<xref linkend='XtGetSelectionValuesIncremental' xrefstyle='select: title'/>
+function is similar to
+<xref linkend='XtGetSelectionValueIncremental' xrefstyle='select: title'/>
+except that it takes a list of targets and client data.
+<xref linkend='XtGetSelectionValuesIncremental' xrefstyle='select: title'/>
+is equivalent to calling
+<xref linkend='XtGetSelectionValueIncremental' xrefstyle='select: title'/>
+successively for each <emphasis remap='I'>target/client_data</emphasis> pair except that
+<xref linkend='XtGetSelectionValuesIncremental' xrefstyle='select: title'/>
+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
+<xref linkend='XtGetSelectionValueIncremental' xrefstyle='select: title'/>
+repeatedly.
+For more information about <emphasis remap='I'>selection</emphasis>, <emphasis remap='I'>target</emphasis>, and
+<emphasis remap='I'>time</emphasis>, see
+<olink targetdoc='icccm' targetptr='Use_of_Selection_Atoms'>Section 2.6</olink> in the
+<olink targetdoc='icccm' targetptr='icccm'>Inter-Client Communication Conventions Manual.</olink>
+</para>
+</sect3>
+<sect3 id="Setting_the_Selection_Owner_for_Incremental_Transfers">
+<title>Setting the Selection Owner for Incremental Transfers</title>
+<para>
+To set the selection owner when using incremental transfers, use
+<xref linkend='XtOwnSelectionIncremental' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtOwnSelectionIncremental'>
+<funcprototype>
+<funcdef>Boolean <function>XtOwnSelectionIncremental</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>Atom <parameter>selection</parameter></paramdef>
+   <paramdef>Time <parameter>time</parameter></paramdef>
+   <paramdef>XtConvertSelectionIncrProc <parameter>convert_callback</parameter></paramdef>
+   <paramdef>XtLoseSelectionIncrProc <parameter>lose_callback</parameter></paramdef>
+   <paramdef>XtSelectionDoneIncrProc <parameter>done_callback</parameter></paramdef>
+   <paramdef>XtCancelConvertSelectionProc <parameter>cancel_callback</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget that wishes to become the owner.  Must be of class Core or any subclass thereof.
+      </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>
+The
+<xref linkend='XtOwnSelectionIncremental' xrefstyle='select: title'/>
+procedure informs the Intrinsics
+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
+<olink targetdoc='icccm' targetptr='Use_of_Selection_Atoms'>Section 2.6</olink> in the
+<olink targetdoc='icccm' targetptr='icccm'>Inter-Client Communication Conventions Manual.</olink>
+</para>
+
+<para>
+If a done_callback procedure is specified, the client owns the storage allocated
+for passing the value to the Intrinsics.  If <emphasis remap='I'>done_callback</emphasis> is NULL,
+the convert_callback procedure must allocate storage using
+<xref linkend='XtMalloc' xrefstyle='select: title'/>,
+<xref linkend='XtRealloc' xrefstyle='select: title'/>,
+or
+<xref linkend='XtCalloc' xrefstyle='select: title'/>,
+and the final value specified is freed by the
+Intrinsics 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>
+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>
+A widget that becomes the selection owner using
+<xref linkend='XtOwnSelectionIncremental' xrefstyle='select: title'/>
+may use
+<xref linkend='XtDisownSelection' xrefstyle='select: title'/>
+to relinquish selection ownership.
+</para>
+</sect3>
+</sect2>
+
+<sect2 id="Setting_and_Retrieving_Selection_Target_Parameters">
+<title>Setting and Retrieving Selection Target Parameters</title>
+<para>
+To specify target parameters for a selection request with a single target,
+use
+<xref linkend='XtSetSelectionParameters' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtSetSelectionParameters'>
+<funcprototype>
+<funcdef>void <function>XtSetSelectionParameters</function></funcdef>
+   <paramdef>Widget <parameter>requestor</parameter></paramdef>
+   <paramdef>Atom <parameter>selection</parameter></paramdef>
+   <paramdef>Atom <parameter>type</parameter></paramdef>
+   <paramdef>XtPointer <parameter>value</parameter></paramdef>
+   <paramdef>unsigned long <parameter>length</parameter></paramdef>
+   <paramdef>int <parameter>format</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>requestor</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget making the request.  Must be of class Core or any subclass thereof.
+      </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>
+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
+<xref linkend='XtGetSelectionValue' xrefstyle='select: title'/>
+or to
+<xref linkend='XtGetSelectionValueIncremental' xrefstyle='select: title'/>
+specifying the same requestor widget and selection atom will generate a
+<function>ConvertSelection</function>
+request referring to the property containing the parameters.  If
+<xref linkend='XtSetSelectionParameters' xrefstyle='select: title'/>
+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>
+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>
+To generate a MULTIPLE
+target request with parameters for any of the multiple targets of the
+selection request, precede individual calls to
+<xref linkend='XtGetSelectionValue' xrefstyle='select: title'/>
+and
+<xref linkend='XtGetSelectionValueIncremental' xrefstyle='select: title'/>
+with corresponding individual calls to
+<xref linkend='XtSetSelectionParameters' xrefstyle='select: title'/>,
+and enclose these all within
+<xref linkend='XtCreateSelectionRequest' xrefstyle='select: title'/>
+and
+<function>XtSendSelectionRequest.</function>
+<xref linkend='XtGetSelectionValues' xrefstyle='select: title'/>
+and
+<xref linkend='XtGetSelectionValuesIncremental' xrefstyle='select: title'/>
+cannot be used to make selection requests with parameterized targets.
+</para>
+
+<para>
+To retrieve any target parameters needed to perform a selection conversion,
+the selection owner calls
+<xref linkend='XtGetSelectionParameters' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtGetSelectionParameters'>
+<funcprototype>
+<funcdef>void <function>XtGetSelectionParameters</function></funcdef>
+   <paramdef>Widget <parameter>owner</parameter></paramdef>
+   <paramdef>Atom <parameter>selection</parameter></paramdef>
+   <paramdef>XtRequestId <parameter>request_id</parameter></paramdef>
+   <paramdef>Atom *<parameter>type_return</parameter></paramdef>
+   <paramdef>XtPointer *<parameter>value_return</parameter></paramdef>
+   <paramdef>unsigned long *<parameter>length_return</parameter></paramdef>
+   <paramdef>int *<parameter>format_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+<xref linkend='XtGetSelectionParameters' xrefstyle='select: title'/>
+may be called only from within an
+<xref linkend='XtConvertSelectionProc' xrefstyle='select: title'/>
+or from within the first call to an
+<xref linkend='XtConvertSelectionIncrProc' xrefstyle='select: title'/>
+with a new request_id.
+</para>
+
+<para>
+It is the responsibility of the caller to free the returned parameters using
+<xref linkend='XtFree' xrefstyle='select: title'/>
+when the parameters are no longer needed.
+</para>
+</sect2>
+
+<sect2 id="Generating_MULTIPLE_Requests">
+<title>Generating MULTIPLE Requests</title>
+<para>
+To have the Intrinsics bundle multiple calls to make selection requests into
+a single request using a <emphasis role='strong'>MULTIPLE</emphasis> target, use
+<xref linkend='XtCreateSelectionRequest' xrefstyle='select: title'/>
+and
+<xref linkend='XtSendSelectionRequest' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtCreateSelectionRequest'>
+<funcprototype>
+<funcdef>void <function>XtCreateSelectionRequest</function></funcdef>
+   <paramdef>Widget <parameter>requestor</parameter></paramdef>
+   <paramdef>Atom <parameter>selection</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>requestor</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget making the request.  Must be of class Core or any subclass thereof.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>selection</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the particular selection desired.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+When
+<xref linkend='XtCreateSelectionRequest' xrefstyle='select: title'/>
+is called, subsequent calls to
+<xref linkend='XtGetSelectionValue' xrefstyle='select: title'/>,
+<xref linkend='XtGetSelectionValueIncremental' xrefstyle='select: title'/>,
+<xref linkend='XtGetSelectionValues' xrefstyle='select: title'/>,
+and
+<xref linkend='XtGetSelectionValuesIncremental' xrefstyle='select: title'/>,
+with the requestor and selection as specified to
+<xref linkend='XtCreateSelectionRequest' xrefstyle='select: title'/>,
+are bundled into a single selection request with
+multiple targets.  The request is made by calling
+<xref linkend='XtSendSelectionRequest' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtSendSelectionRequest'>
+<funcprototype>
+<funcdef>void <function>XtSendSelectionRequest</function></funcdef>
+   <paramdef>Widget <parameter>requestor</parameter></paramdef>
+   <paramdef>Atom <parameter>selection</parameter></paramdef>
+   <paramdef>Time <parameter>time</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>requestor</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget making the request.  Must be of class Core or any subclass thereof.
+      </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>
+When
+<xref linkend='XtSendSelectionRequest' xrefstyle='select: title'/>
+is called with a value of <emphasis remap='I'>requestor</emphasis> and <emphasis remap='I'>selection</emphasis> matching
+a previous call to
+<xref linkend='XtCreateSelectionRequest' xrefstyle='select: title'/>,
+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
+<xref linkend='XtGetSelectionValue' xrefstyle='select: title'/>,
+<xref linkend='XtGetSelectionValueIncremental' xrefstyle='select: title'/>,
+<xref linkend='XtGetSelectionValues' xrefstyle='select: title'/>,
+and
+<xref linkend='XtGetSelectionValueIncremental' xrefstyle='select: title'/>
+are invoked.
+</para>
+
+<para>
+Multi-threaded applications should lock the application context before
+calling
+<xref linkend='XtCreateSelectionRequest' xrefstyle='select: title'/>
+and release the lock after calling
+<xref linkend='XtSendSelectionRequest' xrefstyle='select: title'/>
+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.
+</para>
+
+<para>
+To relinquish the composition of a MULTIPLE request without sending it, use
+<xref linkend='XtCancelSelectionRequest' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtCancelSelectionRequest'>
+<funcprototype>
+<funcdef>void <function>XtCancelSelectionRequest</function></funcdef>
+   <paramdef>Widget <parameter>requestor</parameter></paramdef>
+   <paramdef>Atom <parameter>selection</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>requestor</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget making the request.  Must be of class Core or any subclass thereof.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>selection</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the particular selection desired.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+When
+<xref linkend='XtCancelSelectionRequest' xrefstyle='select: title'/>
+is called, any requests queued since the last call to
+<xref linkend='XtCreateSelectionRequest' xrefstyle='select: title'/>
+for the same widget and selection are discarded
+and any resources reserved are released.
+A subsequent call to
+<xref linkend='XtSendSelectionRequest' xrefstyle='select: title'/>
+will not result in any request being made.
+Subsequent calls to
+<xref linkend='XtGetSelectionValue' xrefstyle='select: title'/>,
+<xref linkend='XtGetSelectionValues' xrefstyle='select: title'/>,
+<xref linkend='XtGetSelectionValueIncremental' xrefstyle='select: title'/>,
+or
+<xref linkend='XtGetSelectionValuesIncremental' xrefstyle='select: title'/>
+will not be deferred.
+</para>
+</sect2>
+
+<sect2 id="Auxiliary_Selection_Properties">
+<title>Auxiliary Selection Properties</title>
+<para>
+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 Intrinsics provides two interfaces for acquiring temporary property names.
+</para>
+
+<para>
+To acquire a temporary property name atom for use in a selection
+request, the client may call
+<xref linkend='XtReservePropertyAtom' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtReservePropertyAtom'>
+<funcprototype>
+<funcdef>Atom <function>XtReservePropertyAtom</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget making a selection request.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<xref linkend='XtReservePropertyAtom' xrefstyle='select: title'/>
+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>
+To return a temporary property name atom for reuse and to delete
+the property named by that atom, use
+<xref linkend='XtReleasePropertyAtom' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtReleasePropertyAtom'>
+<funcprototype>
+<funcdef>void <function>XtReleasePropertyAtom</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>Atom <parameter>atom</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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
+<xref linkend='XtReservePropertyAtom' xrefstyle='select: title'/>
+that is to be released for reuse.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<xref linkend='XtReleasePropertyAtom' xrefstyle='select: title'/>
+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
+<xref linkend='XtReservePropertyAtom' xrefstyle='select: title'/>
+for the specified widget, the results are undefined.
+</para>
+</sect2>
+
+<sect2 id="Retrieving_the_Most_Recent_Timestamp">
+<title>Retrieving the Most Recent Timestamp</title>
+<para>
+To retrieve the timestamp from the most recent call to
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>
+that contained a timestamp, use
+<xref linkend='XtLastTimestampProcessed' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtLastTimestampProcessed'>
+<funcprototype>
+<funcdef>Time <function>XtLastTimestampProcessed</function></funcdef>
+   <paramdef>Display *<parameter>display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies an open display connection.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+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
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>
+for the specified display,
+<xref linkend='XtLastTimestampProcessed' xrefstyle='select: title'/>
+returns zero.
+</para>
+</sect2>
+
+<sect2 id="Retrieving_the_Most_Recent_Event">
+<title>Retrieving the Most Recent Event</title>
+<para>
+To retrieve the event from the most recent call to
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>
+for a specific display, use
+<xref linkend='XtLastEventProcessed' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtLastEventProcessed'>
+<funcprototype>
+<funcdef>XEvent *<function>XtLastEventProcessed</function></funcdef>
+   <paramdef>Display *<parameter>display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+Returns the last event passed to
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>
+for the specified display.  Returns NULL if there is no such event.
+The client must not modify the contents of the returned event.
+</para>
+</sect2>
+</sect1>
+
+<sect1 id="Merging_Exposure_Events_into_a_Region">
+<title>Merging Exposure Events into a Region</title>
+<para>
+The Intrinsics provide an
+<xref linkend='XtAddExposureToRegion' xrefstyle='select: title'/>
+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 <olink targetdoc='libX11' targetptr='Manipulating_Regions' />
+in <olink targetdoc='libX11' targetptr='libX11'>
+Xlib â€” C Language X Interface.</olink>.
+</para>
+
+<para>
+To merge
+<function>Expose</function>
+and
+<function>GraphicsExpose</function>
+events into a region, use
+<xref linkend='XtAddExposureToRegion' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAddExposureToRegion'>
+<funcprototype>
+<funcdef>void <function>XtAddExposureToRegion</function></funcdef>
+   <paramdef>XEvent *<parameter>event</parameter></paramdef>
+   <paramdef>Region <parameter>region</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>&lt;X11/Xutil.h&gt;</function>).
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtAddExposureToRegion' xrefstyle='select: title'/>
+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,
+<xref linkend='XtAddExposureToRegion' xrefstyle='select: title'/>
+returns without an error and without modifying <emphasis remap='I'>region</emphasis>.
+</para>
+
+<para>
+This function is used by the exposure compression mechanism;
+see <xref linkend='Exposure_Compression' />
+</para>
+</sect1>
+
+<sect1 id="Translating_Widget_Coordinates">
+<title>Translating Widget Coordinates</title>
+<para>
+To translate an x-y coordinate pair from widget coordinates to root
+window absolute coordinates, use
+<xref linkend='XtTranslateCoords' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtTranslateCoords'>
+<funcprototype>
+<funcdef>void <function>XtTranslateCoords</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>Position <parameter>x</parameter></paramdef>
+   <paramdef>Position *<parameter>rootx_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget.  Must be of class RectObj or any subclass thereof.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+      <para></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></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>
+While
+<xref linkend='XtTranslateCoords' xrefstyle='select: title'/>
+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>
+</sect1>
+
+<sect1 id="Translating_a_Window_to_a_Widget">
+<title>Translating a Window to a Widget</title>
+<para>
+To translate a given window and display pointer into a widget instance, use
+<xref linkend='XtWindowToWidget' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtWindowToWidget'>
+<funcprototype>
+<funcdef>Widget <function>XtWindowToWidget</function></funcdef>
+   <paramdef>Display *<parameter>display</parameter></paramdef>
+   <paramdef>Window <parameter>window</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+If there is a realized widget whose window is the specified drawable on
+the specified <emphasis remap='I'>display</emphasis>,
+<xref linkend='XtWindowToWidget' xrefstyle='select: title'/>
+returns that widget.
+If not and if the drawable has been associated with a widget through
+<xref linkend='XtRegisterDrawable' xrefstyle='select: title'/>,
+<xref linkend='XtWindowToWidget' xrefstyle='select: title'/>
+returns the widget associated with the drawable.  In other cases it
+returns NULL.
+</para>
+</sect1>
+
+<sect1 id="Handling_Errors">
+<title>Handling Errors</title>
+<para>
+The Intrinsics 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>
+Two levels of interface are provided:
+</para>
+<itemizedlist spacing='compact'>
+  <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>
+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.
+</para>
+<note>
+<para>
+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.
+</para>
+</note>
+
+<para>
+To obtain the error database (for example, to merge with
+an application- or widget-specific database), use
+<xref linkend='XtAppGetErrorDatabase' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppGetErrorDatabase'>
+<funcprototype> <funcdef>XrmDatabase *<function>XtAppGetErrorDatabase</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>app_context</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the application context.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XtAppGetErrorDatabase' xrefstyle='select: title'/>
+function returns the address of the error database.
+The Intrinsics do a lazy binding of the error database and do not merge in the
+database file until the first call to
+<xref linkend='XtAppGetErrorDatabaseText' xrefstyle='select: title'/>.
+</para>
+
+<para>
+For a complete listing of all errors and warnings
+that can be generated by the Intrinsics, see <xref linkend='Intrinsics_Error_Messages' />
+</para>
+
+<para>
+The high-level error and warning handler procedure pointers are of type
+<xref linkend='XtErrorMsgHandler' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtErrorMsgHandler'>
+<funcprototype>
+<funcdef>typedef void <function>(*XtErrorMsgHandler)</function></funcdef>
+   <paramdef>String <parameter>name</parameter></paramdef>
+   <paramdef>String <parameter>type</parameter></paramdef>
+   <paramdef>String <parameter>class</parameter></paramdef>
+   <paramdef>String <parameter>defaultp</parameter></paramdef>
+   <paramdef>String *<parameter>params</parameter></paramdef>
+   <paramdef>Cardinal *<parameter>num_params</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+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.
+</para>
+
+<para>
+An error message handler can obtain the error database text for an
+error or a warning by calling
+<xref linkend='XtAppGetErrorDatabaseText' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppGetErrorDatabaseText'>
+<funcprototype>
+<funcdef>void <function>XtAppGetErrorDatabaseText</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+   <paramdef>String <parameter>name</parameter></paramdef>
+   <paramdef>String <parameter>default</parameter></paramdef>
+   <paramdef>String <parameter>buffer_return</parameter></paramdef>
+   <paramdef>int <parameter>nbytes</parameter></paramdef>
+   <paramdef>XrmDatabase <parameter>database</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+    <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>
+The
+<xref linkend='XtAppGetErrorDatabaseText' xrefstyle='select: title'/>
+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 ".".
+</para>
+
+<para>
+To return the application name and class as passed to
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>
+for a particular Display, use
+<xref linkend='XtGetApplicationNameAndClass' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtGetApplicationNameAndClass'>
+<funcprototype>
+<funcdef>void <function>XtGetApplicationNameAndClass</function></funcdef>
+    <paramdef>Display* <parameter>display</parameter></paramdef>
+    <paramdef>String* <parameter>name_return</parameter></paramdef>
+    <paramdef>String* <parameter>class_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies an open display connection that has been initialized with
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>.
+      </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>
+<xref linkend='XtGetApplicationNameAndClass' xrefstyle='select: title'/>
+returns the application name and class passed to
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>
+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 Intrinsics and must not be modified
+or freed by the caller.
+</para>
+
+<para>
+To register a procedure to be called on fatal error conditions, use
+<xref linkend='XtAppSetErrorMsgHandler' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppSetErrorMsgHandler'>
+<funcprototype>
+<funcdef>XtErrorMsgHandler <function>XtAppSetErrorMsgHandler</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+   <paramdef>XtErrorMsgHandler <parameter>msg_handler</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+<xref linkend='XtAppSetErrorMsgHandler' xrefstyle='select: title'/>
+returns a pointer to the previously
+installed high-level fatal error handler.
+The default high-level fatal error handler provided by the Intrinsics is named
+<function>_XtDefaultErrorMsg</function>
+and constructs a string from the error resource database and calls
+<xref linkend='XtError' xrefstyle='select: title'/>.
+Fatal error message handlers should not return.
+If one does,
+subsequent Intrinsics behavior is undefined.
+</para>
+
+<para>
+To call the high-level error handler, use
+<xref linkend='XtAppErrorMsg' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppErrorMsg'>
+<funcprototype>
+<funcdef>void <function>XtAppErrorMsg</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+   <paramdef>String <parameter>name</parameter></paramdef>
+   <paramdef>String <parameter>type</parameter></paramdef>
+   <paramdef>String <parameter>class</parameter></paramdef>
+   <paramdef>String <parameter>default</parameter></paramdef>
+   <paramdef>String *<parameter>params</parameter></paramdef>
+   <paramdef>Cardinal *<parameter>num_params</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The Intrinsics internal errors all have class
+"XtToolkitError".
+</para>
+
+<para>
+To register a procedure to be called on nonfatal error conditions, use
+<xref linkend='XtAppSetWarningMsgHandler' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppSetWarningMsgHandler'>
+<funcprototype>
+<funcdef>XtErrorMsgHandler <function>XtAppSetWarningMsgHandler</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+   <paramdef>XtErrorMsgHandler <parameter>msg_handler</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+<xref linkend='XtAppSetWarningMsgHandler' xrefstyle='select: title'/>
+returns a pointer to the previously
+installed high-level warning handler.
+The default high-level warning handler provided by the Intrinsics is named
+<function>_XtDefaultWarningMsg</function>
+and constructs a string
+from the error resource database and calls
+<xref linkend='XtWarning' xrefstyle='select: title'/>.
+</para>
+
+<para>
+To call the installed high-level warning handler, use
+<xref linkend='XtAppWarningMsg' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppWarningMsg'>
+<funcprototype>
+<funcdef>void <function>XtAppWarningMsg</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+   <paramdef>String <parameter>name</parameter></paramdef>
+   <paramdef>String <parameter>type</parameter></paramdef>
+   <paramdef>String <parameter>class</parameter></paramdef>
+   <paramdef>String <parameter>default</parameter></paramdef>
+   <paramdef>String *<parameter>params</parameter></paramdef>
+   <paramdef>Cardinal *<parameter>num_params</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The Intrinsics internal warnings all have class
+"XtToolkitError".
+</para>
+
+<para>
+The low-level error and warning handler procedure pointers are of type
+<xref linkend='XtErrorHandler' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtErrorHandler'>
+<funcprototype>
+<funcdef>typedef void <function>(*XtErrorHandler)</function></funcdef>
+   <paramdef>String <parameter>message</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>message</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the error message.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The error handler should display the message string in some appropriate fashion.
+</para>
+
+<para>
+To register a procedure to be called on fatal error conditions, use
+<xref linkend='XtAppSetErrorHandler' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppSetErrorHandler'>
+<funcprototype>
+<funcdef>XtErrorHandler <function>XtAppSetErrorHandler</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+   <paramdef>XtErrorHandler <parameter>handler</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+<xref linkend='XtAppSetErrorHandler' xrefstyle='select: title'/>
+returns a pointer to the previously installed
+low-level fatal error handler.
+The default low-level error handler provided by the Intrinsics is
+<function>_XtDefaultError</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 Intrinsics behavior is undefined.
+</para>
+
+<para>
+To call the installed fatal error procedure, use
+<xref linkend='XtAppError' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppError'>
+<funcprototype>
+<funcdef>void <function>XtAppError</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+   <paramdef>String <parameter>message</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+Most programs should use
+<xref linkend='XtAppErrorMsg' xrefstyle='select: title'/>,
+not
+<xref linkend='XtAppError' xrefstyle='select: title'/>,
+to provide for customization and internationalization of error messages.
+</para>
+
+<para>
+To register a procedure to be called on nonfatal error conditions, use
+<xref linkend='XtAppSetWarningHandler' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppSetWarningHandler'>
+<funcprototype>
+<funcdef>XtErrorHandler <function>XtAppSetWarningHandler</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+   <paramdef>XtErrorHandler <parameter>handler</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+<xref linkend='XtAppSetWarningHandler' xrefstyle='select: title'/>
+returns a pointer to the previously installed
+low-level warning handler.
+The default low-level warning handler provided by the Intrinsics is
+<function>_XtDefaultWarning</function>.
+On POSIX-based systems,
+it prints the message to standard error and returns to the caller.
+</para>
+
+<para>
+To call the installed nonfatal error procedure, use
+<xref linkend='XtAppWarning' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppWarning'>
+<funcprototype>
+<funcdef>void <function>XtAppWarning</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+   <paramdef>String <parameter>message</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+Most programs should use
+<xref linkend='XtAppWarningMsg' xrefstyle='select: title'/>,
+not
+<xref linkend='XtAppWarning' xrefstyle='select: title'/>,
+to provide for customization and internationalization of warning messages.
+</para>
+</sect1>
+
+<sect1 id="Setting_WM_COLORMAP_WINDOWS">
+<title>Setting WM_COLORMAP_WINDOWS</title>
+<para>
+A client may set the value of the <emphasis role='strong'>WM_COLORMAP_WINDOWS</emphasis>
+property on a widget's window by calling
+<xref linkend='XtSetWMColormapWindows' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtSetWMColormapWindows'>
+<funcprototype>
+<funcdef>void <function>XtSetWMColormapWindows</function></funcdef>
+   <paramdef>Widget <parameter>widget</parameter></paramdef>
+   <paramdef>Widget* <parameter>list</parameter></paramdef>
+   <paramdef>Cardinal <parameter>count</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>widget</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the widget on whose window the <emphasis role='strong'>WM_COLORMAP_WINDOWS</emphasis>
+property is stored.  Must be of class Core or any subclass thereof.
+      </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 <emphasis role='strong'>WM_COLORMAP_WINDOWS</emphasis> 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>
+<xref linkend='XtSetWMColormapWindows' xrefstyle='select: title'/>
+returns immediately if <emphasis remap='I'>widget</emphasis> is not realized or if <emphasis remap='I'>count</emphasis> is 0.
+Otherwise,
+<xref linkend='XtSetWMColormapWindows' xrefstyle='select: title'/>
+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>
+Finally,
+<xref linkend='XtSetWMColormapWindows' xrefstyle='select: title'/>
+stores the resulting window list in the <emphasis role='strong'>WM_COLORMAP_WINDOWS</emphasis>
+property on the specified widget's window.
+Refer to Section 4.1.8 in the <emphasis remap='I'>Inter-Client Communication Conventions Manual.</emphasis> for details of
+the semantics of the <emphasis role='strong'>WM_COLORMAP_WINDOWS</emphasis> property.
+</para>
+</sect1>
+<!--    FIXME: -->
+<sect1 id="Finding_File_Names">
+<title>Finding File Names</title>
+<para>
+The Intrinsics provide procedures to look for a file by name, allowing
+string substitutions in a list of file specifications.  Two
+routines are provided for this:
+<xref linkend='XtFindFile' xrefstyle='select: title'/>
+and
+<xref linkend='XtResolvePathname' xrefstyle='select: title'/>.
+<xref linkend='XtFindFile' xrefstyle='select: title'/>
+uses an arbitrary set of client-specified substitutions, and
+<xref linkend='XtResolvePathname' xrefstyle='select: title'/>
+uses a set of standard substitutions corresponding
+to the <emphasis remap='I'>X/Open Portability Guide</emphasis> language localization conventions.
+Most applications should use
+<xref linkend='XtResolvePathname' xrefstyle='select: title'/>.
+</para>
+
+<para>
+A string substitution is defined by a list of
+<function>Substitution</function>
+entries.
+</para>
+<literallayout >
+typedef struct {
+       char match;
+       String substitution;
+} SubstitutionRec, *Substitution;
+</literallayout>
+<para>
+File name evaluation is handled in an operating-system-dependent
+fashion by an
+<xref linkend='XtFilePredicate' xrefstyle='select: title'/>
+procedure.
+</para>
+
+<funcsynopsis id='XtFilePredicate'>
+<funcprototype>
+<funcdef>typedef Boolean <function>(*XtFilePredicate)</function></funcdef>
+   <paramdef>String <parameter>filename</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>filename</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a potential filename.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+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.
+</para>
+
+<para>
+To search for a file using substitutions in a path list, use
+<xref linkend='XtFindFile' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtFindFile'>
+<funcprototype>
+<funcdef>String <function>XtFindFile</function></funcdef>
+   <paramdef>String <parameter>path</parameter></paramdef>
+   <paramdef>Substitution <parameter>substitutions</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_substitutions</parameter></paramdef>
+   <paramdef>XtFilePredicate <parameter>predicate</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+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,
+<xref linkend='XtFindFile' xrefstyle='select: title'/>
+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,
+<xref linkend='XtFindFile' xrefstyle='select: title'/>
+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
+<xref linkend='XtFindFile' xrefstyle='select: title'/>
+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
+<xref linkend='XtFindFile' xrefstyle='select: title'/>.
+If no string yields a
+<function>True</function>
+return from the predicate,
+<xref linkend='XtFindFile' xrefstyle='select: title'/>
+returns NULL.
+</para>
+
+<para>
+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>
+It is the responsibility of the caller to free the returned string using
+<xref linkend='XtFree' xrefstyle='select: title'/>
+when it is no longer needed.
+</para>
+
+<para>
+To search for a file using standard substitutions in a path list, use
+<xref linkend='XtResolvePathname' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtResolvePathname'>
+<funcprototype>
+<funcdef>String <function>XtResolvePathname</function></funcdef>
+   <paramdef>Display *<parameter>display</parameter></paramdef>
+   <paramdef>String <parameter>type</parameter></paramdef>
+   <paramdef>Substitution <parameter>substitutions</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_substitutions</parameter></paramdef>
+   <paramdef>XtFilePredicate <parameter>predicate</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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></para>
+      
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>filename</emphasis>
+    </term>
+    <listitem>
+      <para></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>
+The substitutions specified by
+<xref linkend='XtResolvePathname' xrefstyle='select: title'/>
+are determined from the value of the language string retrieved by
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>
+for the specified display.
+To set the
+language for all applications specify "*xnlLanguage: <emphasis remap='I'>lang</emphasis>" in the
+resource database.
+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 Intrinsics make no interpretation of the parts other
+than to use them in substitutions as described below.
+</para>
+
+
+<para>
+<xref linkend='XtResolvePathname' xrefstyle='select: title'/>
+calls
+<xref linkend='XtFindFile' xrefstyle='select: title'/>
+with the following substitutions
+in addition to any passed by the caller and returns the value returned by
+<xref linkend='XtFindFile' xrefstyle='select: title'/>:
+</para>
+<!-- PROBLEM BELOW HERE -->
+
+
+<variablelist>
+  <varlistentry>
+    <term>
+%N
+    </term>
+    <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>
+  </varlistentry>
+  <varlistentry>
+    <term>
+%T
+    </term>
+    <listitem>
+      <para>
+The value of the <emphasis remap='I'>type</emphasis> parameter.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+%S
+    </term>
+    <listitem>
+      <para>
+The value of the <emphasis remap='I'>suffix</emphasis> parameter.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+%L
+    </term>
+    <listitem>
+      <para>
+The language string associated with the specified display.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+%l
+    </term>
+    <listitem>
+      <para>
+The language part of the display's language string.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+%t
+    </term>
+    <listitem>
+      <para>
+The territory part of the display's language string.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+%c
+    </term>
+    <listitem>
+      <para>
+The codeset part of the display's language string.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+%C
+    </term>
+    <listitem>
+      <para>
+The customization string retrieved from the resource
+database associated with <emphasis remap='I'>display</emphasis>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+%D
+    </term>
+    <listitem>
+      <para>
+The value of the implementation-specific default path.
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+
+
+<!-- PROBLEM ABOVE HERE -->
+<para>
+If a path is passed to
+<xref linkend='XtResolvePathname' xrefstyle='select: title'/>,
+it is passed along to
+<xref linkend='XtFindFile' xrefstyle='select: title'/>.
+If the <emphasis remap='I'>path</emphasis> argument is NULL, the value of the
+<emphasis role='strong'>XFILESEARCHPATH</emphasis>
+environment variable is passed to
+<xref linkend='XtFindFile' xrefstyle='select: title'/>.
+If <emphasis role='strong'>XFILESEARCHPATH</emphasis>
+is not defined, an implementation-specific default path is used
+that contains at least six entries.  These entries
+must contain the following substitutions:
+</para>
+
+
+<!-- OK PAST HERE -->
+
+<literallayout>
+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
+</literallayout>
+
+<para>
+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>
+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>
+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>
+A suggested value for the default path on POSIX-based systems is
+</para>
+<literallayout>
+   /usr/lib/X11/%L/%T/%N%C%S:/usr/lib/X11/%l/%T/%N%C%S:\
+   /usr/lib/X11/%T/%N%C%S:/usr/lib/X11/%L/%T/%N%S:\
+   /usr/lib/X11/%l/%T/%N%S:/usr/lib/X11/%T/%N%S
+</literallayout>
+
+
+<para>
+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>
+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
+<emphasis role='strong'>XFILESEARCHPATH</emphasis>
+to
+</para>
+<literallayout>
+   %D:ourdir/%T/%N%C:ourdir/%T/%N
+</literallayout>
+
+<para>
+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
+<xref linkend='XtGetApplicationNameAndClass' xrefstyle='select: title'/>.
+If no value is specified in the database, the empty string is used.
+</para>
+
+<para>
+It is the responsibility of the caller to free the returned string using
+<xref linkend='XtFree' xrefstyle='select: title'/>
+when it is no longer needed.
+</para>
+
+
+</sect1>
+<!-- END OF FIXME -->
+<sect1 id="Hooks_for_External_Agents">
+<title>Hooks for External Agents</title>
+<para>
+Applications may register
+functions that are called at a particular control points in the Intrinsics.
+These functions are intended to be used to provide notification
+of an "X Toolkit 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>
+To retrieve the hook registration widget, use
+<xref linkend='XtHooksOfDisplay' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtHooksOfDisplay'>
+<funcprototype>
+<funcdef>Widget <function>XtHooksOfDisplay</function></funcdef>
+   <paramdef>Display *<parameter>display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the desired display.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+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>
+The following procedures can be called with the hook registration object
+as an argument:
+</para>
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+<xref linkend='XtAddCallback' xrefstyle='select: title'/>,
+<xref linkend='XtAddCallbacks' xrefstyle='select: title'/>,
+<xref linkend='XtRemoveCallback' xrefstyle='select: title'/>,
+<xref linkend='XtRemoveCallbacks' xrefstyle='select: title'/>,
+<xref linkend='XtRemoveAllCallbacks' xrefstyle='select: title'/>,
+<xref linkend='XtCallCallbacks' xrefstyle='select: title'/>,
+<xref linkend='XtHasCallbacks' xrefstyle='select: title'/>,
+<xref linkend='XtCallCallbackList' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtClass' xrefstyle='select: title'/>,
+<function>XtSuperclass</function>,
+<xref linkend='XtIsSubclass' xrefstyle='select: title'/>,
+<xref linkend='XtCheckSubclass' xrefstyle='select: title'/>,
+<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>
+<xref linkend='XtWidgetToApplicationContext' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtName' xrefstyle='select: title'/>,
+<function>XtParent</function>,
+<xref linkend='XtDisplayOfObject' xrefstyle='select: title'/>,
+<xref linkend='XtScreenOfObject' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtSetValues' xrefstyle='select: title'/>,
+<xref linkend='XtGetValues' xrefstyle='select: title'/>,
+<xref linkend='XtVaSetValues' xrefstyle='select: title'/>,
+<xref linkend='XtVaGetValues' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+</itemizedlist>
+
+<sect2 id="Hook_Object_Resources">
+<title>Hook Object Resources</title>
+<para>
+The resource names, classes, and representation types that are specified
+in the hook object resource list are:
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <colspec colwidth='1.0*' colname='c3'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Name</entry>
+      <entry>Class</entry>
+      <entry>Representation</entry>
+    </row>
+  </thead>
+  <tbody>
+    <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>
+  </tbody>
+  </tgroup>
+</informaltable>
+</para>
+
+<para>
+Descriptions of each of these resources:
+</para>
+
+<para>
+The XtNcreateHook callback list is called from:
+<xref linkend='XtCreateWidget' xrefstyle='select: title'/>,
+<xref linkend='XtCreateManagedWidget' xrefstyle='select: title'/>,
+<xref linkend='XtCreatePopupShell' xrefstyle='select: title'/>,
+<xref linkend='XtAppCreateShell' xrefstyle='select: title'/>,
+and their corresponding varargs versions.
+</para>
+
+<para>
+The <emphasis remap='I'>call_data</emphasis> parameter in a createHook callback may be
+cast to type
+<function>XtCreateHookData</function>.
+</para>
+<literallayout >
+typedef struct {
+       String   type;
+       Widget   widget;
+       ArgList  args;
+       Cardinal num_args;
+} XtCreateHookDataRec, *XtCreateHookData;
+</literallayout>
+<para>
+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>
+The XtNchangeHook callback list is called from:
+</para>
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+<xref linkend='XtSetValues' xrefstyle='select: title'/>,
+<xref linkend='XtVaSetValues' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtManageChild' xrefstyle='select: title'/>,
+<xref linkend='XtManageChildren' xrefstyle='select: title'/>,
+<xref linkend='XtUnmanageChild' xrefstyle='select: title'/>,
+<xref linkend='XtUnmanageChildren' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtRealizeWidget' xrefstyle='select: title'/>,
+<xref linkend='XtUnrealizeWidget' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtAddCallback' xrefstyle='select: title'/>,
+<xref linkend='XtRemoveCallback' xrefstyle='select: title'/>,
+<function>XtAddCallbacks,</function>
+<xref linkend='XtRemoveCallbacks' xrefstyle='select: title'/>,
+<xref linkend='XtRemoveAllCallbacks' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtAugmentTranslations' xrefstyle='select: title'/>,
+<xref linkend='XtOverrideTranslations' xrefstyle='select: title'/>,
+<xref linkend='XtUninstallTranslations' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtSetKeyboardFocus' xrefstyle='select: title'/>,
+<xref linkend='XtSetWMColormapWindows' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtSetMappedWhenManaged' xrefstyle='select: title'/>,
+<xref linkend='XtMapWidget' xrefstyle='select: title'/>,
+<xref linkend='XtUnmapWidget' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtPopup' xrefstyle='select: title'/>,
+<xref linkend='XtPopupSpringLoaded' xrefstyle='select: title'/>,
+<xref linkend='XtPopdown' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+</itemizedlist>
+
+<para>
+The <emphasis remap='I'>call_data</emphasis> parameter in a changeHook callback may
+be cast to type
+<function>XtChangeHookData</function>.
+</para>
+<literallayout >
+typedef struct {
+       String  type;
+       Widget  widget;
+       XtPointer event_data;
+       Cardinal num_event_data;
+} XtChangeHookDataRec, *XtChangeHookData;
+</literallayout>
+<para>
+When the changeHook callbacks are called as a result of a call to
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+or
+<xref linkend='XtVaSetValues' xrefstyle='select: title'/>,
+<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>.
+</para>
+<literallayout >
+typedef struct {
+       Widget   old, req;
+       ArgList  args;
+       Cardinal num_args;
+} XtChangeHookSetValuesDataRec, *XtChangeHookSetValuesData;
+</literallayout>
+<para>
+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>
+When the changeHook callbacks are called as a result of a call to
+<xref linkend='XtManageChild' xrefstyle='select: title'/>
+or
+<xref linkend='XtManageChildren' xrefstyle='select: title'/>,
+<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>
+When the changeHook callbacks are called as a result of a call to
+<xref linkend='XtUnmanageChild' xrefstyle='select: title'/>
+or
+<xref linkend='XtUnmanageChildren' xrefstyle='select: title'/>,
+<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>
+The changeHook callbacks are called twice as a result of a call to
+<xref linkend='XtChangeManagedSet' xrefstyle='select: title'/>,
+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>
+When the changeHook callbacks are called as a result of a call to
+<xref linkend='XtRealizeWidget' xrefstyle='select: title'/>,
+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>
+When the changeHook callbacks are called as a result of a call to
+<xref linkend='XtUnrealizeWidget' xrefstyle='select: title'/>,
+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>
+When the changeHook callbacks are called as a result of a call to
+<xref linkend='XtAddCallback' xrefstyle='select: title'/>,
+<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>
+When the changeHook callbacks are called as a result of a call to
+<xref linkend='XtAddCallbacks' xrefstyle='select: title'/>,
+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>
+When the changeHook callbacks are called as a result of a call to
+<xref linkend='XtRemoveCallback' xrefstyle='select: title'/>,
+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>
+When the changeHook callbacks are called as a result of a call to
+<xref linkend='XtRemoveCallbacks' xrefstyle='select: title'/>,
+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>
+When the changeHook callbacks are called as a result of a call to
+<xref linkend='XtRemoveAllCallbacks' xrefstyle='select: title'/>,
+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>
+When the changeHook callbacks are called as a result of a call to
+<xref linkend='XtAugmentTranslations' xrefstyle='select: title'/>,
+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>
+When the changeHook callbacks are called as a result of a call to
+<xref linkend='XtOverrideTranslations' xrefstyle='select: title'/>,
+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>
+When the changeHook callbacks are called as a result of a call to
+<xref linkend='XtUninstallTranslations' xrefstyle='select: title'/>,
+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>
+When the changeHook callbacks are called as a result of a call to
+<xref linkend='XtSetKeyboardFocus' xrefstyle='select: title'/>,
+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 <xref linkend='XtSetKeyboardFocus' xrefstyle='select: title'/>. The
+callbacks are called before returning from <xref linkend='XtSetKeyboardFocus' xrefstyle='select: title'/>.
+</para>
+
+<para>
+When the changeHook callbacks are called as a result of a call to
+<xref linkend='XtSetWMColormapWindows' xrefstyle='select: title'/>,
+<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 <xref linkend='XtSetWMColormapWindows' xrefstyle='select: title'/>, and
+<emphasis remap='I'>num_event_data</emphasis> is the length of the list. The callbacks are
+called before returning from <xref linkend='XtSetWMColormapWindows' xrefstyle='select: title'/>.
+</para>
+
+<para>
+When the changeHook callbacks are called as a result of a call to
+<xref linkend='XtSetMappedWhenManaged' xrefstyle='select: title'/>,
+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 <xref linkend='XtSetMappedWhenManaged' xrefstyle='select: title'/>.
+The callbacks are called after setting the widget's mapped_when_managed
+field and before realizing or unrealizing the widget.
+</para>
+
+<para>
+When the changeHook callbacks are called as a result of a call to
+<xref linkend='XtMapWidget' xrefstyle='select: title'/>,
+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>
+When the changeHook callbacks are called as a result of a call to
+<xref linkend='XtUnmapWidget' xrefstyle='select: title'/>,
+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>
+When the changeHook callbacks are called as a result of a call to
+<xref linkend='XtPopup' xrefstyle='select: title'/>,
+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 <xref linkend='XtPopup' xrefstyle='select: title'/>.
+The callbacks are called before returning from <xref linkend='XtPopup' xrefstyle='select: title'/>.
+</para>
+
+<para>
+When the changeHook callbacks are called as a result of a call to
+<xref linkend='XtPopupSpringLoaded' xrefstyle='select: title'/>,
+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 <xref linkend='XtPopupSpringLoaded' xrefstyle='select: title'/>.
+</para>
+
+<para>
+When the changeHook callbacks are called as a result of a call to
+<xref linkend='XtPopdown' xrefstyle='select: title'/>,
+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 <xref linkend='XtPopdown' xrefstyle='select: title'/>.
+</para>
+
+<para>
+A widget set that exports interfaces that change application state
+without employing the Intrinsics library should invoke the change hook
+itself.  This is done by:
+</para>
+
+<literallayout >
+        XtCallCallbacks(XtHooksOfDisplay(dpy), XtNchangeHook, call_data);
+</literallayout>
+<para>
+The XtNconfigureHook callback list is called any time the Intrinsics
+move, resize, or configure a widget and when
+<xref linkend='XtResizeWindow' xrefstyle='select: title'/>
+is called.
+</para>
+
+<para>
+The <emphasis remap='I'>call_data</emphasis> parameter may be cast to type
+<function>XtConfigureHookData.</function>
+</para>
+<literallayout >
+typedef struct {
+       String type;
+       Widget widget;
+       XtGeometryMask changeMask;
+       XWindowChanges changes;
+} XtConfigureHookDataRec, *XtConfigureHookData;
+</literallayout>
+<para>
+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>
+The XtNgeometryHook callback list is called from
+<xref linkend='XtMakeGeometryRequest' xrefstyle='select: title'/>
+and
+<xref linkend='XtMakeResizeRequest' xrefstyle='select: title'/>
+once before and once after geometry negotiation occurs.
+</para>
+
+<para>
+The <emphasis remap='I'>call_data</emphasis> parameter may be cast to type
+<function>XtGeometryHookData</function>.
+</para>
+
+<literallayout >
+typedef struct {
+       String type;
+       Widget widget;
+       XtWidgetGeometry* request;
+       XtWidgetGeometry* reply;
+       XtGeometryResult result;
+} XtGeometryHookDataRec, *XtGeometryHookData;
+</literallayout>
+<para>
+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>
+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>
+<literallayout >
+typedef struct {
+       String type;
+       Widget widget;
+} XtDestroyHookDataRec, *XtDestroyHookData;
+</literallayout>
+<para>
+When the destroyHook callbacks are called as a result of a call to
+<xref linkend='XtDestroyWidget' xrefstyle='select: title'/>,
+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>
+The XtNshells and XtnumShells are read-only resources that report a
+list of all parentless shell widgets associated with a display.
+</para>
+
+<para>
+Clients who use these hooks must exercise caution in calling Intrinsics
+functions in order to avoid recursion.
+</para>
+</sect2>
+
+<sect2 id="Querying_Open_Displays">
+<title>Querying Open Displays</title>
+<para>
+To retrieve a list of the Displays associated with an application context,
+use
+<xref linkend='XtGetDisplays' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtGetDisplays'>
+<funcprototype>
+<funcdef>void <function>XtGetDisplays</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+   <paramdef>Display ***<parameter>dpy_return</parameter></paramdef>
+   <paramdef>Cardinal *<parameter>num_dpy_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+<xref linkend='XtGetDisplays' xrefstyle='select: title'/> 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
+<xref linkend='XtFree' xrefstyle='select: title'/>.
+</para>
+</sect2>
+</sect1>
+
+</chapter>
diff --git a/specs/CH12.xml b/specs/CH12.xml
new file mode 100644 (file)
index 0000000..3ae6542
--- /dev/null
@@ -0,0 +1,1166 @@
+<chapter id='Nonwidget_Objects'>
+<title>Nonwidget Objects</title>
+
+<para>
+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 (unnamed),
+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 Intrinsics routines.
+</para>
+<sect1 id="Data_Structures">
+<title>Data Structures</title>
+<para>
+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>
+</sect1>
+
+<sect1 id="Object_Objects">
+<title>Object Objects</title>
+<para>
+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>
+<sect2 id="ObjectClassPart_Structure">
+<title>ObjectClassPart Structure</title>
+<para>
+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'>n</emphasis> for some integer <emphasis remap='I'>n</emphasis> 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'>n</emphasis> fields with NULL or zero as appropriate to the type.
+</para>
+<literallayout >
+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>
+The extension record defined for
+<function>ObjectClassPart</function>
+with a <emphasis remap='I'>record_type</emphasis> equal to
+<emphasis role='strong'>NULLQUARK</emphasis>
+is
+<function>ObjectClassExtensionRec</function>.
+</para>
+<literallayout >
+typedef struct {
+       XtPointer next_extension;    See <xref linkend='Class_Extension_Records' />
+       XrmQuark record_type;        See <xref linkend='Class_Extension_Records' />
+       long version;                See <xref linkend='Class_Extension_Records' />
+       Cardinal record_size;        See <xref linkend='Class_Extension_Records' />
+       XtAllocateProc allocate;     See <xref linkend='Widget_Instance_Allocation_The_allocate_Procedure' />.
+       XtDeallocateProc deallocate; See <xref linkend='Widget_Instance_Deallocation_The_deallocate_Procedure' />.
+} ObjectClassExtensionRec, *ObjectClassExtension;
+</literallayout>
+<para>
+The prototypical
+<function>ObjectClass</function>
+consists of just the
+<function>ObjectClassPart</function>.
+</para>
+<literallayout >
+typedef struct _ObjectClassRec {
+       ObjectClassPart object_class;
+} ObjectClassRec, *ObjectClass;
+</literallayout>
+<para>
+The predefined class record and pointer for
+<function>ObjectClassRec</function>
+are
+</para>
+
+<para>
+In
+<function>IntrinsicP.h</function>:
+</para>
+<literallayout >
+extern ObjectClassRec objectClassRec;
+</literallayout>
+<para>
+In
+<function>Intrinsic.h</function>:
+</para>
+<literallayout >
+extern WidgetClass objectClass;
+</literallayout>
+<para>
+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 <xref linkend='Class_Extension_Records' />).
+<function>Intrinsic.h</function>
+uses an incomplete structure definition to ensure that the
+compiler catches attempts to access private data:
+</para>
+<literallayout >
+typedef struct _ObjectClassRec* ObjectClass;
+</literallayout>
+
+</sect2>
+
+<sect2 id="ObjectPart_Structure">
+<title>ObjectPart Structure</title>
+<para>
+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>
+<literallayout >
+typedef struct _ObjectPart {
+       Widget self;
+       WidgetClass widget_class;
+       Widget parent;
+       Boolean being_destroyed;
+       XtCallbackList destroy_callbacks;
+       XtPointer constraints;
+} ObjectPart;
+</literallayout>
+<para>
+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>
+In
+<function>IntrinsicP.h</function>:
+</para>
+<literallayout >
+typedef struct _ObjectRec {
+       ObjectPart object;
+} ObjectRec, *Object;
+</literallayout>
+<para>
+In
+<function>Intrinsic.h</function>:
+</para>
+<literallayout >
+typedef struct _ObjectRec *Object;
+</literallayout>
+
+</sect2>
+
+<sect2 id="Object_Resources">
+<title>Object Resources</title>
+<para>
+The resource names, classes, and representation types specified in the
+<function>objectClassRec</function>
+resource list are:
+</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <colspec colwidth='1.0*' colname='c3'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Name</entry>
+      <entry>Class</entry>
+      <entry>Representation</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>XtNdestroyCallback</entry>
+      <entry>XtCCallback</entry>
+      <entry>XtRCallback</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+</sect2>
+
+<sect2 id="ObjectPart_Default_Values">
+<title>ObjectPart Default Values</title>
+<para>
+All fields in
+<function>ObjectPart</function>
+have the same default values as the corresponding fields in
+<function>CorePart</function>.
+</para>
+</sect2>
+
+<sect2 id="Object_Arguments_to_xI_Routines">
+<title>Object Arguments to Intrinsics Routines</title>
+<para>
+The WidgetClass arguments to the following procedures may be
+<function>objectClass</function>
+or any subclass:
+</para>
+
+<para>
+<emphasis role='strong'>XtInitializeWidgetClass</emphasis>,
+<emphasis role='strong'>XtCreateWidget</emphasis>,
+<emphasis role='strong'>XtVaCreateWidget</emphasis>
+<emphasis role='strong'>XtIsSubclass</emphasis>,
+<emphasis role='strong'>XtCheckSubclass</emphasis>
+<emphasis role='strong'>XtGetResourceList</emphasis>,
+<emphasis role='strong'>XtGetConstraintResourceList</emphasis>
+</para>
+
+<para>
+The Widget arguments to the following procedures may be of class
+Object
+or any subclass:
+</para>
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+<xref linkend='XtCreateWidget' xrefstyle='select: title'/>,
+<xref linkend='XtVaCreateWidget' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtAddCallback' xrefstyle='select: title'/>,
+<xref linkend='XtAddCallbacks' xrefstyle='select: title'/>,
+<xref linkend='XtRemoveCallback' xrefstyle='select: title'/>,
+<xref linkend='XtRemoveCallbacks' xrefstyle='select: title'/>,
+<xref linkend='XtRemoveAllCallbacks' xrefstyle='select: title'/>,
+<xref linkend='XtCallCallbacks' xrefstyle='select: title'/>,
+<xref linkend='XtHasCallbacks' xrefstyle='select: title'/>,
+<xref linkend='XtCallCallbackList' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtClass' xrefstyle='select: title'/>,
+<function>XtSuperclass</function>,
+<xref linkend='XtIsSubclass' xrefstyle='select: title'/>,
+<xref linkend='XtCheckSubclass' xrefstyle='select: title'/>,
+<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>
+<xref linkend='XtIsManaged' xrefstyle='select: title'/>,
+<xref linkend='XtIsSensitive' xrefstyle='select: title'/>
+(both will return
+<function>False</function>
+if argument is not a subclass of
+RectObj)
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtIsRealized' xrefstyle='select: title'/>
+(returns the state of the nearest windowed ancestor
+if class of argument is not a subclass of
+Core)
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtWidgetToApplicationContext' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtDestroyWidget' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<function>XtParent</function>,
+<xref linkend='XtDisplayOfObject' xrefstyle='select: title'/>,
+<xref linkend='XtScreenOfObject' xrefstyle='select: title'/>,
+<xref linkend='XtWindowOfObject' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtSetKeyboardFocus' xrefstyle='select: title'/>
+(descendant)
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtGetGC' xrefstyle='select: title'/>,
+<xref linkend='XtReleaseGC' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtName' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtSetValues' xrefstyle='select: title'/>,
+<xref linkend='XtGetValues' xrefstyle='select: title'/>,
+<xref linkend='XtVaSetValues' xrefstyle='select: title'/>,
+<xref linkend='XtVaGetValues' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtGetSubresources' xrefstyle='select: title'/>,
+<xref linkend='XtGetApplicationResources' xrefstyle='select: title'/>,
+<xref linkend='XtVaGetSubresources' xrefstyle='select: title'/>,
+<xref linkend='XtVaGetApplicationResources' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtConvert' xrefstyle='select: title'/>,
+<xref linkend='XtConvertAndStore' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+The return value of the following procedures will be of class
+Object
+or a subclass:
+</para>
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+<xref linkend='XtCreateWidget' xrefstyle='select: title'/>,
+<xref linkend='XtVaCreateWidget' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<function>XtParent</function>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtNameToWidget' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+The return value of the following procedures will be
+<function>objectClass</function>
+or a subclass:
+</para>
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+<xref linkend='XtClass' xrefstyle='select: title'/>,
+<function>XtSuperclass</function>
+    </para>
+  </listitem>
+</itemizedlist>
+</sect2>
+
+<sect2 id="Use_of_Objects">
+<title>Use of Objects</title>
+<para>
+The
+Object
+class exists to enable programmers to use the Intrinsics'
+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>
+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>.
+<xref linkend='XtCreateWidget' xrefstyle='select: title'/>
+will otherwise generate an error message on an attempt to create a
+nonwidget child.
+</para>
+
+<para>
+Of the classes defined by the Intrinsics,
+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>
+</sect2>
+</sect1>
+
+<sect1 id="Rectangle_Objects">
+<title>Rectangle Objects</title>
+<para>
+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
+to avoid conflict with the Xlib
+<function>Rectangle</function>
+data type.
+</para>
+<sect2 id="RectObjClassPart_Structure">
+<title>RectObjClassPart Structure</title>
+<para>
+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'>n</emphasis> for some integer
+<emphasis remap='I'>n</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'>n</emphasis> fields with NULL or zero as appropriate to the type.
+</para>
+<literallayout >
+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>
+The
+RectObj
+class record consists of just the
+<function>RectObjClassPart</function>.
+</para>
+<literallayout >
+typedef struct _RectObjClassRec {
+       RectObjClassPart rect_class;
+} RectObjClassRec, *RectObjClass;
+</literallayout>
+<para>
+The predefined class record and pointer for
+<function>RectObjClassRec</function>
+are
+</para>
+
+<para>
+In
+<function>Intrinsic.h</function>:
+</para>
+<literallayout >
+extern RectObjClassRec rectObjClassRec;
+</literallayout>
+<para>
+In
+<function>Intrinsic.h</function>:
+</para>
+<literallayout >
+extern WidgetClass rectObjClass;
+</literallayout>
+<para>
+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>
+<literallayout >
+typedef struct _RectObjClassRec* RectObjClass;
+</literallayout>
+
+</sect2>
+
+<sect2 id="RectObjPart_Structure">
+<title>RectObjPart Structure</title>
+<para>
+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>
+<literallayout >
+typedef struct _RectObjPart {
+       Position x, y;
+       Dimension width, height;
+       Dimension border_width;
+       Boolean managed;
+       Boolean sensitive;
+       Boolean ancestor_sensitive;
+} RectObjPart;
+</literallayout>
+<para>
+RectObj
+objects have the RectObj fields immediately following the Object fields.
+</para>
+<literallayout >
+typedef struct _RectObjRec {
+       ObjectPart object;
+       RectObjPart rectangle;
+} RectObjRec, *RectObj;
+</literallayout>
+<para>
+In
+<function>Intrinsic.h</function>:
+</para>
+<literallayout >
+typedef struct _RectObjRec* RectObj;
+</literallayout>
+
+</sect2>
+
+<sect2 id="RectObj_Resources">
+<title>RectObj Resources</title>
+<para>
+The resource names, classes, and representation types that are specified in the
+<function>rectObjClassRec</function>
+resource list are:
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <colspec colwidth='1.0*' colname='c3'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Name</entry>
+      <entry>Class</entry>
+      <entry>Representation</entry>
+    </row>
+  </thead>
+  <tbody>
+    <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>
+  </tbody>
+  </tgroup>
+</informaltable>
+</para>
+</sect2>
+
+<sect2 id="RectObjPart_Default_Values">
+<title>RectObjPart Default Values</title>
+<para>
+All fields in
+<function>RectObjPart</function>
+have the same default values as the corresponding fields in
+<function>CorePart</function>.
+</para>
+</sect2>
+
+<sect2 id="Widget_Arguments_to_xI_Routines">
+<title>Widget Arguments to Intrinsics Routines</title>
+<para>
+The WidgetClass arguments to the following procedures may be
+<function>rectObjClass</function>
+or any subclass:
+</para>
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+<xref linkend='XtCreateManagedWidget' xrefstyle='select: title'/>,
+<xref linkend='XtVaCreateManagedWidget' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+The Widget arguments to the following procedures may be of class
+RectObj
+or any subclass:
+</para>
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+<xref linkend='XtConfigureWidget' xrefstyle='select: title'/>,
+<xref linkend='XtMoveWidget' xrefstyle='select: title'/>,
+<xref linkend='XtResizeWidget' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtMakeGeometryRequest' xrefstyle='select: title'/>,
+<xref linkend='XtMakeResizeRequest' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtManageChildren' xrefstyle='select: title'/>,
+<xref linkend='XtManageChild' xrefstyle='select: title'/>,
+<xref linkend='XtUnmanageChildren' xrefstyle='select: title'/>,
+<xref linkend='XtUnmanageChild' xrefstyle='select: title'/>,
+<xref linkend='XtChangeManagedSet' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtQueryGeometry' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtSetSensitive' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtTranslateCoords' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+The return value of the following procedures will be of class
+RectObj
+or a subclass:
+</para>
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+<xref linkend='XtCreateManagedWidget' xrefstyle='select: title'/>,
+<xref linkend='XtVaCreateManagedWidget' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+</itemizedlist>
+</sect2>
+
+<sect2 id="Use_of_Rectangle_Objects">
+<title>Use of Rectangle Objects</title>
+<para>
+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>
+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>.
+<xref linkend='XtCreateWidget' xrefstyle='select: title'/>
+or
+<xref linkend='XtCreateManagedWidget' xrefstyle='select: title'/>
+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
+Intrinsics accept rectobj children.
+</para>
+
+<para>
+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 Intrinsics; 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>
+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>
+The Intrinsics will clear areas of a parent window obscured by
+rectobj children, causing exposure events, under the following
+circumstances:
+</para>
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+A rectobj child is managed or unmanaged.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+In a call to
+<xref linkend='XtSetValues' xrefstyle='select: title'/>
+on a rectobj child, one or more of the set_values procedures returns
+<function>True</function>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+In a call to
+<xref linkend='XtConfigureWidget' xrefstyle='select: title'/>
+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
+<xref linkend='XtMoveWidget' xrefstyle='select: title'/>
+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
+<xref linkend='XtResizeWidget' xrefstyle='select: title'/>
+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
+<xref linkend='XtMakeGeometryRequest' xrefstyle='select: title'/>
+(or
+<xref linkend='XtMakeResizeRequest' xrefstyle='select: title'/>)
+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>
+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>
+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>
+</sect2>
+</sect1>
+
+<sect1 id="Undeclared_Class">
+<title>Undeclared Class</title>
+<para>
+The Intrinsics 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 spacing='compact'>
+  <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>
+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>
+</sect1>
+
+<sect1 id="Widget_Arguments_to_Intrinsics_Routines">
+<title>Widget Arguments to Intrinsics Routines</title>
+<para>
+The WidgetClass arguments to the following procedures must be of class
+Shell
+or a subclass:
+</para>
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+<xref linkend='XtCreatePopupShell' xrefstyle='select: title'/>,
+<xref linkend='XtVaCreatePopupShell' xrefstyle='select: title'/>,
+<xref linkend='XtAppCreateShell' xrefstyle='select: title'/>,
+<xref linkend='XtVaAppCreateShell' xrefstyle='select: title'/>,
+<xref linkend='XtOpenApplication' xrefstyle='select: title'/>,
+<xref linkend='XtVaOpenApplication' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+The Widget arguments to the following procedures must be of class
+Core
+or any subclass:
+</para>
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+<xref linkend='XtCreatePopupShell' xrefstyle='select: title'/>,
+<xref linkend='XtVaCreatePopupShell' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtAddEventHandler' xrefstyle='select: title'/>,
+<xref linkend='XtAddRawEventHandler' xrefstyle='select: title'/>,
+<xref linkend='XtRemoveEventHandler' xrefstyle='select: title'/>,
+<xref linkend='XtRemoveRawEventHandler' xrefstyle='select: title'/>,
+<xref linkend='XtInsertEventHandler' xrefstyle='select: title'/>,
+<xref linkend='XtInsertRawEventHandler' xrefstyle='select: title'/>
+<xref linkend='XtInsertEventTypeHandler' xrefstyle='select: title'/>,
+<xref linkend='XtRemoveEventTypeHandler' xrefstyle='select: title'/>,
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtRegisterDrawable' xrefstyle='select: title'/>
+<xref linkend='XtDispatchEventToWidget' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtAddGrab' xrefstyle='select: title'/>,
+<xref linkend='XtRemoveGrab' xrefstyle='select: title'/>,
+<xref linkend='XtGrabKey' xrefstyle='select: title'/>,
+<xref linkend='XtGrabKeyboard' xrefstyle='select: title'/>,
+<xref linkend='XtUngrabKey' xrefstyle='select: title'/>,
+<xref linkend='XtUngrabKeyboard' xrefstyle='select: title'/>,
+<xref linkend='XtGrabButton' xrefstyle='select: title'/>,
+<xref linkend='XtGrabPointer' xrefstyle='select: title'/>,
+<xref linkend='XtUngrabButton' xrefstyle='select: title'/>,
+<xref linkend='XtUngrabPointer' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtBuildEventMask' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtCreateWindow' xrefstyle='select: title'/>,
+<function>XtDisplay</function>,
+<xref linkend='XtScreen' xrefstyle='select: title'/>,
+<xref linkend='XtWindow' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtNameToWidget' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtGetSelectionValue' xrefstyle='select: title'/>,
+<xref linkend='XtGetSelectionValues' xrefstyle='select: title'/>,
+<xref linkend='XtOwnSelection' xrefstyle='select: title'/>,
+<xref linkend='XtDisownSelection' xrefstyle='select: title'/>,
+<xref linkend='XtOwnSelectionIncremental' xrefstyle='select: title'/>,
+<xref linkend='XtGetSelectionValueIncremental' xrefstyle='select: title'/>,
+<xref linkend='XtGetSelectionValuesIncremental' xrefstyle='select: title'/>,
+<xref linkend='XtGetSelectionRequest' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtInstallAccelerators' xrefstyle='select: title'/>,
+<xref linkend='XtInstallAllAccelerators' xrefstyle='select: title'/>
+(both destination and source)
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtAugmentTranslations' xrefstyle='select: title'/>,
+<xref linkend='XtOverrideTranslations' xrefstyle='select: title'/>,
+<xref linkend='XtUninstallTranslations' xrefstyle='select: title'/>,
+<xref linkend='XtCallActionProc' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtMapWidget' xrefstyle='select: title'/>,
+<xref linkend='XtUnmapWidget' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtRealizeWidget' xrefstyle='select: title'/>,
+<xref linkend='XtUnrealizeWidget' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtSetMappedWhenManaged' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtCallAcceptFocus' xrefstyle='select: title'/>,
+<xref linkend='XtSetKeyboardFocus' xrefstyle='select: title'/>
+(subtree)
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtResizeWindow' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XtSetWMColormapWindows' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+The Widget arguments to the following procedures must be of class
+Composite
+or any subclass:
+</para>
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+<xref linkend='XtCreateManagedWidget' xrefstyle='select: title'/>,
+<xref linkend='XtVaCreateManagedWidget' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+The Widget arguments to the following procedures must be of a subclass of
+Shell:
+</para>
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+<xref linkend='XtPopdown' xrefstyle='select: title'/>,
+<xref linkend='XtCallbackPopdown' xrefstyle='select: title'/>,
+<xref linkend='XtPopup' xrefstyle='select: title'/>,
+<xref linkend='XtCallbackNone' xrefstyle='select: title'/>,
+<xref linkend='XtCallbackNonexclusive' xrefstyle='select: title'/>,
+<xref linkend='XtCallbackExclusive' xrefstyle='select: title'/>,
+<xref linkend='XtPopupSpringLoaded' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+The return value of the following procedure will be of class
+Core
+or a subclass:
+</para>
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+<xref linkend='XtWindowToWidget' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+The return value of the following procedures will be of a subclass of
+Shell:
+</para>
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+<xref linkend='XtAppCreateShell' xrefstyle='select: title'/>,
+<xref linkend='XtVaAppCreateShell' xrefstyle='select: title'/>,
+<xref linkend='XtAppInitialize' xrefstyle='select: title'/>,
+<xref linkend='XtVaAppInitialize' xrefstyle='select: title'/>,
+<xref linkend='XtCreatePopupShell' xrefstyle='select: title'/>,
+<xref linkend='XtVaCreatePopupShell' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+</itemizedlist>
+</sect1>
+</chapter>
diff --git a/specs/CH13.xml b/specs/CH13.xml
new file mode 100644 (file)
index 0000000..0216b34
--- /dev/null
@@ -0,0 +1,770 @@
+<chapter id='Evolution_of_the_Intrinsics'>
+<title>Evolution of the Intrinsics</title>
+
+<para>
+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>
+The Intrinsics 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>
+In particular, widget programmers may wish to conform to the convention
+described in <xref linkend='Class_Extension_Records' /> when defining class extension records.
+</para>
+<sect1 id="Determining_Specification_Revision_Level">
+<title>Determining Specification Revision Level</title>
+<para>
+Widget and application developers who wish to maintain a common source
+pool that will build properly with implementations of the Intrinsics
+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>
+<literallayout >
+#define XtSpecificationRelease 6
+</literallayout>
+<para>
+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>
+</sect1>
+
+<sect1 id="Release_to_Release_Compatibility">
+<title>Release 3 to Release 4 Compatibility</title>
+<para>
+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>
+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>
+<sect2 id="Additional_Arguments">
+<title>Additional Arguments</title>
+<para>
+Arguments were added to the procedure definitions for
+<xref linkend='XtInitProc' xrefstyle='select: title'/>,
+<xref linkend='XtSetValuesFunc' xrefstyle='select: title'/>,
+and
+<xref linkend='XtEventHandler' xrefstyle='select: title'/>
+to provide more information and to
+allow event handlers to abort further dispatching of the current event
+(caution is advised!).  The added arguments to
+<xref linkend='XtInitProc' xrefstyle='select: title'/>
+and
+<xref linkend='XtSetValuesFunc' xrefstyle='select: title'/>
+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>
+</sect2>
+
+<sect2 id="set_values_almost_Procedures">
+<title>set_values_almost Procedures</title>
+<para>
+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>
+The current specification for the manner in which a set_values_almost
+procedure returns information to the Intrinsics 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>
+No known implementation of the Intrinsics correctly implemented the
+Release 3 interface, so it is expected that the impact of this
+specification change is small.
+</para>
+</sect2>
+
+<sect2 id="Query_Geometry">
+<title>Query Geometry</title>
+<para>
+A composite widget layout routine that calls
+<xref linkend='XtQueryGeometry' xrefstyle='select: title'/>
+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>
+</sect2>
+
+<sect2 id="unrealizeCallback_Callback_List">
+<title>unrealizeCallback Callback List</title>
+<para>
+In order to provide a mechanism for widgets to be notified when they
+become unrealized through a call to
+<xref linkend='XtUnrealizeWidget' xrefstyle='select: title'/>,
+the callback
+list name ``unrealizeCallback'' has been defined by the Intrinsics.  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>
+</sect2>
+
+<sect2 id="Subclasses_of_WMShell">
+<title>Subclasses of WMShell</title>
+<para>
+The formal adoption of the <emphasis remap='I'>Inter-Client Communication Conventions Manual.</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>
+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>
+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>
+</sect2>
+
+<sect2 id="Resource_Type_Converters">
+<title>Resource Type Converters</title>
+<para>
+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>
+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
+<xref linkend='XtConverter' xrefstyle='select: title'/>
+was incomplete.
+</para>
+</sect2>
+
+<sect2 id="KeySym_Case_Conversion_Procedure">
+<title>KeySym Case Conversion Procedure</title>
+<para>
+The specification for the
+<xref linkend='XtCaseProc' xrefstyle='select: title'/>
+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 Intrinsics
+implemented the previously documented interface.
+</para>
+</sect2>
+
+<sect2 id="Nonwidget_Objects_2">
+<title>Nonwidget Objects</title>
+<para>
+Formal support for nonwidget objects is new to Release 4.  A
+prototype implementation was latent in at least one Release 3
+implementation of the Intrinsics, 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>
+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>
+</sect2>
+</sect1>
+
+<sect1 id="Release_to_Release_Compatibility_2">
+<title>Release 4 to Release 5 Compatibility</title>
+<para>
+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>
+<sect2 id="baseTranslations_Resource">
+<title>baseTranslations Resource</title>
+<para>
+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>
+Applications wishing to take advantage of the new functionality
+would change their application defaults file, e.g., from
+<literallayout >
+        app.widget.translations: <emphasis remap='I'>value</emphasis>
+to
+        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>
+</sect2>
+
+<sect2 id="Resource_File_Search_Path">
+<title>Resource File Search Path</title>
+<para>
+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
+<emphasis role='strong'>XFILESEARCHPATH</emphasis>
+and
+<emphasis role='strong'>XUSERFILESEARCHPATH</emphasis>
+values when overriding the system defaults.
+</para>
+</sect2>
+
+<sect2 id="Customization_Resource">
+<title>Customization Resource</title>
+<para>
+<xref linkend='XtResolvePathname' xrefstyle='select: title'/>
+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>
+</sect2>
+
+<sect2 id="Per_Screen_Resource_Database">
+<title>Per-Screen Resource Database</title>
+<para>
+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 Intrinsics
+database initialization.  Such applications will need to be aware
+of the particular screen on which each shell widget is to be created.
+</para>
+
+<para>
+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
+<xref linkend='XtResolvePathname' xrefstyle='select: title'/>.
+</para>
+</sect2>
+
+<sect2 id="Internationalization_of_Applications">
+<title>Internationalization of Applications</title>
+<para>
+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 Intrinsics
+the restrictions of this model have been followed.
+In particular, the new Intrinsics interfaces are designed not to
+preclude an application from using other alternatives.
+For this reason, no Intrinsics 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>
+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>
+The internationalization additions also define event filters
+as a part of the Xlib Input Method specifications.  The
+Intrinsics enable the use of event filters through additions to
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>.
+Applications that may not be dispatching all events through
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>
+should be reviewed in the context of this new input method mechanism.
+</para>
+
+<para>
+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 Intrinsics to locate the database from localization information
+supplied by the client.
+</para>
+
+<para>
+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>
+</sect2>
+
+<sect2 id="Permanently_Allocated_Strings">
+<title>Permanently Allocated Strings</title>
+<para>
+In order to permit additional memory savings, an Xlib interface was
+added to allow the resource manager to avoid copying certain string
+constants.  The Intrinsics 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>
+</sect2>
+
+<sect2 id="Arguments_to_Existing_Functions">
+<title>Arguments to Existing Functions</title>
+<para>
+The <emphasis remap='I'>args</emphasis> argument to
+<xref linkend='XtAppInitialize' xrefstyle='select: title'/>,
+<xref linkend='XtVaAppInitialize' xrefstyle='select: title'/>,
+<xref linkend='XtOpenDisplay' xrefstyle='select: title'/>,
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>,
+and
+<xref linkend='XtInitialize' xrefstyle='select: title'/>
+were changed from
+<function>Cardinal</function>*
+to int* to conform to pre-existing convention and avoid otherwise
+annoying typecasting in ANSI C environments.
+</para>
+</sect2>
+</sect1>
+
+<sect1 id="Release_to_Release_Compatibility_3">
+<title>Release 5 to Release 6 Compatibility</title>
+<para>
+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>
+<sect2 id="Widget_Internals">
+<title>Widget Internals</title>
+<para>
+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>
+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>
+As a convenience, an interface to locate a widget class extension
+record on a linked list,
+<xref linkend='XtGetClassExtension' xrefstyle='select: title'/>,
+has been added.
+</para>
+
+<para>
+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>
+The wording of the process followed by
+<xref linkend='XtUnmanageChildren' xrefstyle='select: title'/>
+has changed slightly to better handle changes to the managed set
+during phase 2 destroy processing.
+</para>
+
+<para>
+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 Intrinsics need not
+compute the region.
+</para>
+</sect2>
+
+<sect2 id="General_Application_Development">
+<title>General Application Development</title>
+<para>
+<xref linkend='XtOpenApplication' xrefstyle='select: title'/>
+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,
+<xref linkend='XtAppInitialize' xrefstyle='select: title'/>,
+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>
+The toolkit initialization function
+<xref linkend='XtToolkitInitialize' xrefstyle='select: title'/>
+may be called multiple times without penalty.
+</para>
+
+<para>
+In order to optimize changes in geometry to a set of geometry-managed
+children, a new interface,
+<xref linkend='XtChangeManagedSet' xrefstyle='select: title'/>,
+has been added.
+</para>
+</sect2>
+
+<sect2 id="Communication_with_Window_and_Session_Managers">
+<title>Communication with Window and Session Managers</title>
+<para>
+The revision of the <emphasis remap='I'>Inter-Client Communication Conventions Manual.</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>
+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
+<xref linkend='XtSessionGetToken' xrefstyle='select: title'/>
+and
+<xref linkend='XtSessionReturnToken' xrefstyle='select: title'/>.
+There is also a new command line argument, -xtsessionID, which facilitates
+the session manager in restarting applications based on the Intrinsics.
+</para>
+
+<para>
+The resource name and class strings defined by the Intrinsics shell
+widgets in
+<function>&lt;X11/Shell.h&gt;</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>
+</sect2>
+
+<sect2 id="Geometry_Management_2">
+<title>Geometry Management</title>
+<para>
+A clarification to the specification was made to indicate that geometry
+requests may include current values along with the requested changes.
+</para>
+</sect2>
+
+<sect2 id="Event_Management_2">
+<title>Event Management</title>
+<para>
+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
+<xref linkend='XtInsertEventTypeHandler' xrefstyle='select: title'/>
+and
+<xref linkend='XtRemoveEventTypeHandler' xrefstyle='select: title'/>.
+Since the mechanism to indicate selection of extension events is specific
+to the extension being used, the Intrinsics introduces
+<xref linkend='XtRegisterExtensionSelector' xrefstyle='select: title'/>,
+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 Intrinsics event dispatcher may now be replaced or enveloped
+by the application with
+<xref linkend='XtSetEventDispatcher' xrefstyle='select: title'/>.
+The dispatcher may wish to call
+<xref linkend='XtGetKeyboardFocusWidget' xrefstyle='select: title'/>
+to determine the widget with the current Intrinsics keyboard focus.
+A dispatcher, after determining the destination widget, may use
+<xref linkend='XtDispatchEventToWidget' xrefstyle='select: title'/>
+to cause the event to be dispatched to the event handlers registered
+by a specific widget.
+</para>
+
+<para>
+To permit the dispatching of events
+for nonwidget drawables, such as pixmaps that are not associated
+with a widget's window,
+<xref linkend='XtRegisterDrawable' xrefstyle='select: title'/>
+and
+<xref linkend='XtUnregisterDrawable' xrefstyle='select: title'/>
+have been added to the library.  A related update was made to
+the description of
+<xref linkend='XtWindowToWidget' xrefstyle='select: title'/>.
+</para>
+
+<para>
+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
+<xref linkend='XtToolkitThreadInitialize' xrefstyle='select: title'/>,
+<xref linkend='XtAppLock' xrefstyle='select: title'/>,
+<xref linkend='XtAppUnlock' xrefstyle='select: title'/>,
+<xref linkend='XtAppSetExitFlag' xrefstyle='select: title'/>,
+and
+<xref linkend='XtAppGetExitFlag' xrefstyle='select: title'/>.
+Widget writers may also use
+<xref linkend='XtProcessLock' xrefstyle='select: title'/>
+and
+<xref linkend='XtProcessUnlock' xrefstyle='select: title'/>.
+</para>
+
+<para>
+Safe handling of POSIX signals and other asynchronous notifications
+is now provided by use of
+<xref linkend='XtAppAddSignal' xrefstyle='select: title'/>,
+<xref linkend='XtNoticeSignal' xrefstyle='select: title'/>,
+and
+<xref linkend='XtRemoveSignal' xrefstyle='select: title'/>.
+</para>
+
+<para>
+The application can receive notification of an impending block
+in the Intrinsics event manager by registering interest through
+<xref linkend='XtAppAddBlockHook' xrefstyle='select: title'/>
+and
+<xref linkend='XtRemoveBlockHook' xrefstyle='select: title'/>.
+</para>
+
+<para>
+<xref linkend='XtLastEventProcessed' xrefstyle='select: title'/>
+returns the most recent event passed to
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>
+for a specified display.
+</para>
+</sect2>
+
+<sect2 id="Resource_Management_2">
+<title>Resource Management</title>
+<para>
+Resource converters are registered by the Intrinsics for window gravity
+and for three new resource types associated with session participation:
+RestartStyle, CommandArgArray and DirectoryString.
+</para>
+
+<para>
+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>
+</sect2>
+
+<sect2 id="Translation_Management_2">
+<title>Translation Management</title>
+<para>
+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>
+</sect2>
+
+<sect2 id="Selections">
+<title>Selections</title>
+<para>
+The targets of selection requests may be parameterized, as described
+by the revised <emphasis remap='I'>Inter-Client Communication Conventions Manual.</emphasis>.
+When such requests are made,
+<xref linkend='XtSetSelectionParameters' xrefstyle='select: title'/>
+is used by the requestor to specify the target parameters and
+<xref linkend='XtGetSelectionParameters' xrefstyle='select: title'/>
+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,
+<xref linkend='XtCreateSelectionRequest' xrefstyle='select: title'/>,
+<xref linkend='XtCancelSelectionRequest' xrefstyle='select: title'/>,
+and
+<xref linkend='XtSendSelectionRequest' xrefstyle='select: title'/>
+are used to envelop the assembly of the request.
+When the parameters themselves are the names of properties,
+the Intrinsics provides support for the economical use of property atom names;
+see
+<xref linkend='XtReservePropertyAtom' xrefstyle='select: title'/>
+and
+<xref linkend='XtReleasePropertyAtom' xrefstyle='select: title'/>.
+</para>
+</sect2>
+
+<sect2 id="External_Agent_Hooks">
+<title>External Agent Hooks</title>
+<para>
+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
+<xref linkend='XtHooksOfDisplay' xrefstyle='select: title'/>,
+which returns the hook registration widget, and
+<xref linkend='XtGetDisplays' xrefstyle='select: title'/>,
+which returns a list of the X displays associated with an application context.
+</para>
+</sect2>
+</sect1>
+</chapter>
diff --git a/specs/Makefile.am b/specs/Makefile.am
new file mode 100644 (file)
index 0000000..c922dbb
--- /dev/null
@@ -0,0 +1,37 @@
+
+if ENABLE_SPECS
+
+# Main DocBook/XML files (DOCTYPE book)
+docbook = intrinsics.xml
+
+# Included chapters, appendix, images
+chapters =             \
+       acknowledgement.xml     \
+       preface.xml     \
+       CH01.xml        \
+       CH02.xml        \
+       CH03.xml        \
+       CH04.xml        \
+       CH05.xml        \
+       CH06.xml        \
+       CH07.xml        \
+       CH08.xml        \
+       CH09.xml        \
+       CH10.xml        \
+       CH11.xml        \
+       CH12.xml        \
+       CH13.xml        \
+       appA.xml        \
+       appB.xml        \
+       appC.xml        \
+       appD.xml        \
+       appE.xml        \
+       appF.xml
+
+# The location where the DocBook/XML files and their generated formats are installed
+shelfdir = $(docdir)
+
+# Generate DocBook/XML output formats with or without stylesheets
+include $(top_srcdir)/docbook.am
+
+endif ENABLE_SPECS
diff --git a/specs/acknowledgement.xml b/specs/acknowledgement.xml
new file mode 100644 (file)
index 0000000..ea25a5a
--- /dev/null
@@ -0,0 +1,323 @@
+<!-- <acknowledgements> -->
+<dedication>
+<title>Acknowledgments</title>
+
+<para>
+The design of the X11 Intrinsics was done primarily by Joel McCormack
+of Digital WSL. Major contributions to the design and implementation
+also were done by Charles Haynes, Mike Chow, and Paul Asente of Digital
+WSL. Additional contributors to the design and/or implementation were:
+</para>
+
+<!-- <sidebar> -->
+<para>
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+  <tgroup cols='2' rowsep='0' colsep='0'>
+  <colspec colwidth='1.0*' />
+  <colspec colwidth='1.0*' />
+  <tbody>
+  <row><?dbfo row-height="0.2cm"?>
+    <entry>Loretta Guarino-Reid (Digital WSL)</entry>
+    <entry>Rich Hyde (Digital WSL)</entry>
+  </row>
+  <row><?dbfo row-height="0.2cm"?>
+     <entry>Susan Angebranndt (Digital WSL)</entry>
+    <entry>Terry Weissman (Digital WSL)</entry>
+  </row>
+  <row><?dbfo row-height="0.2cm"?>
+     <entry>Mary Larson (Digital UEG)</entry>
+    <entry>Mark Manasse (Digital SRC)</entry>
+  </row>
+  <row><?dbfo row-height="0.5cm"?>
+     <entry>Jim Gettys (Digital SRC)</entry>
+    <entry>Leo Treggiari (Digital SDT)</entry>
+  </row>
+  <row><?dbfo row-height="0.5cm"?>
+     <entry>Ralph Swick (Project Athena and Digital ERP)</entry>
+    <entry>Mark Ackerman (Project Athena)</entry>
+  </row>
+  <row><?dbfo row-height="0.5cm"?>
+     <entry>Ron Newman (Project Athena)</entry>
+    <entry>Bob Scheifler (MIT LCS)</entry>
+  </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+</para>
+<!-- </sidebar> -->
+
+<para>
+The contributors to the X10 toolkit also deserve mention. Although the X11 Intrinsics present an
+entirely different programming style, they borrow heavily from the implicit and
+explicit concepts in the X10 toolkit.
+</para>
+
+<para>
+The design and implementation of the X10 Intrinsics were done by:
+</para>
+
+<!-- <sidebar> -->
+<para>
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+  <tgroup cols='1' rowsep='0' colsep='0'>
+  <colspec colwidth='1.0*' />
+  <tbody>
+  <row>
+    <entry>Terry Weissman (Digital WSL)</entry>
+  </row>
+  <row>
+    <entry>Smokey Wallace (Digital WSL)</entry>
+  </row>
+  <row>
+    <entry>Phil Karlton (Digital WSL)</entry>
+  </row>
+  <row>
+    <entry>Charles Haynes (Digital WSL)</entry>
+  </row>
+  <row>
+    <entry>Frank Hall (HP)</entry>
+  </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+</para>
+<!-- </sidebar> -->
+
+<para>
+The design and implementation of the X10 toolkit’s sample widgets were by
+the above, as well as by:
+</para>
+
+<!-- <sidebar> -->
+<para>
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+  <tgroup cols='1' rowsep='0' colsep='0'>
+  <colspec colwidth='1.0*' />
+  <tbody>
+  <row>
+    <entry>Ram Rao (Digital UEG)</entry>
+  </row>
+  <row>
+    <entry>Mary Larson (Digital UEG)</entry>
+  </row>
+  <row>
+    <entry>Mike Gancarz (Digital UEG)</entry>
+  </row>
+  <row>
+    <entry>Kathleen Langone (Digital UEG)</entry>
+  </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+</para>
+<!-- </sidebar> -->
+
+<para>
+These widgets provided a checklist of requirements that we had to address in the X11 Intrinsics.
+</para>
+<para>
+Thanks go to Al Mento of Digital’s UEG Documentation Group for formatting and generally
+improving this document and to John Ousterhout of Berkeley for extensively reviewing early
+drafts of it.
+</para>
+<para>
+Finally, a special thanks to Mike Chow, whose extensive performance analysis of the X10 toolkit
+provided the justification to redesign it entirely for X11.
+</para>
+
+<literallayout>
+Joel McCormack
+Western Software Laboratory
+Digital Equipment Corporation
+March 1988
+</literallayout>
+
+
+<para>
+The current design of the Intrinsics has benefited greatly from the
+input of several dedicated reviewers in the membership of the X
+Consortium. In addition to those already mentioned, the following
+individuals have dedicated significant time to suggesting improvements
+to the Intrinsics:
+</para>
+
+<!-- <sidebar> -->
+<para>
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+  <tgroup cols='2' rowsep='0' colsep='0'>
+  <colspec colwidth='1.0*' />
+  <colspec colwidth='1.0*' />
+  <tbody>
+  <row>
+    <entry>Steve Pitschke (Stellar)</entry>
+    <entry>C.Doug Blewett (AT&amp;T)</entry>
+  </row>
+  <row>
+    <entry>Bob Miller (HP)</entry>
+    <entry>David Schiferl (Tektronix)</entry>
+  </row>
+  <row>
+    <entry>Fred Taft (HP)</entry>
+    <entry>Michael Squires (Sequent)</entry>
+  </row>
+  <row>
+    <entry>Marcel Meth (AT&amp;T)</entry>
+    <entry>JimFulton (MIT)</entry>
+  </row>
+  <row>
+    <entry>Mike Collins (Digital)</entry>
+    <entry>Kerry Kimbrough (Texas Instruments)</entry>
+  </row>
+  <row>
+    <entry>Scott McGregor (Digital)</entry>
+    <entry>Phil Karlton (Digital)</entry>
+  </row>
+  <row>
+    <entry>Julian Payne (ESS)</entry>
+    <entry>Jacques Davy (Bull)</entry>
+  </row>
+  <row>
+    <entry>Gabriel Beged-Dov (HP)</entry>
+    <entry>GlennWidener (Tektronix)</entry>
+  </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+</para>
+<!-- </sidebar> -->
+
+<para>
+Thanks go to each of them for the countless hours spent reviewing drafts and code.
+</para>
+
+<literallayout>
+Ralph R. Swick
+External Research Group
+Digital Equipment Corporation
+MIT Project Athena
+June 1988
+</literallayout>
+
+
+<para>
+From Release 3 to Release 4, several new members joined the design team. We greatly appreciate
+the thoughtful comments, suggestions, lengthy discussions, and in some cases implementation
+code contributed by each of the following:
+</para>
+
+<!-- <sidebar> -->
+<para>
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+  <tgroup cols='2' rowsep='0' colsep='0'>
+  <colspec colwidth='1.0*' />
+  <colspec colwidth='1.0*' />
+  <tbody>
+  <row>
+    <entry>Don Alecci (AT&amp;T)</entry>
+    <entry>EllisCohen (OSF)</entry>
+  </row>
+  <row>
+    <entry>Donna Converse (MIT)</entry>
+    <entry>Clive Feather (IXI)</entry>
+  </row>
+  <row>
+    <entry>Nayeem Islam (Sun)</entry>
+    <entry>Dana Laursen (HP)</entry>
+  </row>
+  <row>
+    <entry>Keith Packard (MIT)</entry>
+    <entry>Chris Peterson (MIT)</entry>
+  </row>
+  <row>
+    <entry>Richard Probst (Sun)</entry>
+    <entry>Larry Cable (Sun)</entry>
+  </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+</para>
+<!-- </sidebar> -->
+
+<para>
+In Release 5, the effort to define the internationalization additions was headed by Bill McMahon
+of Hewlett Packard and Frank Rojas of IBM. This has been an educational process for many of
+us, and Bill and Frank’s tutelage has carried us through. Vania Joloboff of the OSF also contributed
+to the internationalization additions. The implementation efforts of Bill, Gabe Beged-Dov,
+and especially Donna Converse for this release are also gratefully acknowledged.
+</para>
+
+<literallayout>
+Ralph R. Swick
+December 1989
+and
+July 1991
+</literallayout>
+
+<para>
+The Release 6 Intrinsics is a result of the collaborative efforts of participants in the X Consortium’s
+intrinsics working group. A few individuals contributed substantial design proposals, participated
+in lengthy discussions, reviewed final specifications, and in most cases, were also
+responsible for sections of the implementation. They deserve recognition and thanks for their
+major contributions:
+</para>
+
+<!-- <sidebar> -->
+<para>
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+  <tgroup cols='2' rowsep='0' colsep='0'>
+  <colspec colwidth='1.0*' />
+  <colspec colwidth='1.0*' />
+  <tbody>
+  <row>
+    <entry>Paul Asente (Adobe)</entry>
+    <entry>Larry Cable (SunSoft)</entry>
+  </row>
+  <row>
+    <entry>Ellis Cohen (OSF)</entry>
+    <entry>Daniel Dardailler (OSF)</entry>
+  </row>
+  <row>
+    <entry>Vania Joloboff (OSF)</entry>
+    <entry>KalebKeithley (X Consortium)</entry>
+  </row>
+  <row>
+    <entry>Courtney Loomis (HP)</entry>
+    <entry>Douglas Rand (OSF)</entry>
+  </row>
+  <row>
+    <entry>Bob Scheifler (X Consortium)</entry>
+    <entry>Ajay Vohra (SunSoft)</entry>
+  </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+</para>
+<!-- </sidebar> -->
+
+<para>
+Many others analyzed designs, offered useful comments and suggestions, and participated in a
+significant subset of the process. The following people deserve thanks for their contributions:
+Andy Bovingdon, Sam Chang, Chris Craig, George Erwin-Grotsky, Keith Edwards, Clive
+Feather, Stephen Gildea, Dan Heller, Steve Humphrey, David Kaelbling, Jaime Lau, Rob Lembree,
+Stuart Marks, Beth Mynatt, Tom Paquin, Chris Peterson, Kamesh Ramakrishna, Tom
+Rodriguez, Jim VanGilder, Will Walker, and Mike Wexler.
+</para>
+
+<para>
+I am especially grateful to two of my colleagues: Ralph Swick for expert editorial guidance, and
+Kaleb Keithley for leadership in the implementation and the specification work.
+</para>
+
+<literallayout>
+Donna Converse
+X Consortium
+April 1994
+</literallayout>
+</dedication>
+<!-- </acknowledgements> -->
diff --git a/specs/appA.xml b/specs/appA.xml
new file mode 100644 (file)
index 0000000..daf40eb
--- /dev/null
@@ -0,0 +1,112 @@
+<appendix id='Resource_File_Format'>
+<title>Resource File Format</title>
+<para>
+A resource file contains text representing the default resource values for an
+application or set of applications.
+</para>
+
+<para>
+The format of resource files is defined by
+<emphasis remap='I'>Xlib â€” C Language X Interface.</emphasis> and is reproduced here
+for convenience only.
+</para>
+
+<para>The format of a resource specification is</para>
+<informaltable frame='none'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='0.3*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <tbody>
+    <row>
+      <entry>ResourceLine</entry>
+      <entry>= Comment | IncludeFile | ResourceSpec | &lt;empty line&gt;</entry>
+    </row>
+    <row>
+      <entry>Comment</entry>
+      <entry>="!" {&lt;any character except null or newline&gt;}</entry>
+    </row>
+    <row>
+      <entry>IncludeFile</entry>
+      <entry>= "#" WhiteSpace "include" WhiteSpace FileName WhiteSpace</entry>
+    </row>
+    <row>
+      <entry>FileName</entry>
+      <entry>= &lt;valid filename for operating system&gt;</entry>
+    </row>
+    <row>
+      <entry>ResourceSpec</entry>
+      <entry>= WhiteSpace ResourceName WhiteSpace ":" WhiteSpace Value</entry>
+    </row>
+    <row>
+      <entry>ResourceName</entry>
+      <entry>= [Binding] {Component Binding} ComponentName</entry>
+    </row>
+    <row>
+      <entry>Binding</entry>
+      <entry>="." | "*"</entry>
+    </row>
+    <row>
+      <entry>WhiteSpace</entry>
+      <entry>= {&lt;space> | &lt;horizontal tab&gt;}</entry>
+    </row>
+    <row>
+      <entry>Component</entry>
+      <entry>= "?" | ComponentName</entry>
+    </row>
+    <row>
+      <entry>ComponentName</entry>
+      <entry>= NameChar {NameChar}</entry>
+    </row>
+    <row>
+      <entry>NameChar</entry>
+      <entry>= "a"-"z" | "A"-"Z" | "0"-"9" | "_" | "-"</entry>
+    </row>
+    <row>
+      <entry>Value</entry>
+      <entry>={&lt;any character except null or unescaped newline&gt;}</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+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>
+If the last character on a line is a backslash (\),
+that line is assumed to continue on the next line.
+</para>
+
+<para>
+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.
+</para>
+<para>
+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.
+</para>
+<para>
+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>
+</appendix>
diff --git a/specs/appB.xml b/specs/appB.xml
new file mode 100644 (file)
index 0000000..0afac11
--- /dev/null
@@ -0,0 +1,1181 @@
+<appendix id='Translation_Table_Syntax'>
+<title>Translation Table Syntax</title>
+<para><emphasis role='strong'>Notation</emphasis></para>
+
+<para>
+Syntax is specified in EBNF notation with the following conventions:
+</para>
+
+<informaltable frame='none'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='0.1*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <tbody>
+    <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>
+All terminals are enclosed in double quotation marks (" ").
+Informal descriptions are enclosed in angle brackets (&lt; &gt;).
+Syntax
+</para>
+
+<para>The syntax of a translation table is</para>
+<informaltable frame='none'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='0.2*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <tbody>
+    <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>= [ "^" | "$" | "\\\\" ] &lt;ISO Latin 1 character&gt;</entry>
+    </row>
+    <row>
+      <entry>event</entry>
+      <entry>= [modifier_list] "&lt;"event_type"&gt;" [ "(" 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>= "@" &lt;keysym&gt; | &lt;see ModifierNames table below&gt;</entry>
+    </row>
+    <row>
+      <entry>event_type</entry>
+      <entry>= &lt;see Event Types table below&gt;</entry>
+    </row>
+    <row>
+      <entry>detail</entry>
+      <entry>= &lt;event specific details&gt;</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>= <quote>"</quote> {&lt;Latin 1 character&gt; | escape_char} ["\\\\" ] <quote>"</quote></entry>
+    </row>
+    <row>
+      <entry>escape_char</entry>
+      <entry>= "\\""</entry>
+    </row>
+    <row>
+      <entry>unquoted_string</entry>
+      <entry>= {&lt;Latin 1 character except space, tab, ",", "\\n", ")"&gt;}</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+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".
+</para>
+<para><emphasis role='strong'>Modifier Names</emphasis></para>
+
+<para>
+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>
+
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+If the modifier list has no entries and is not "None",
+it means "don't care" on all modifiers.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+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.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+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.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If a modifier is preceded by a tilde (~),
+it means that that modifier must not be asserted.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If "None" is specified, it means no modifiers can be asserted.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If a colon (:) is specified at the beginning of the modifier list,
+it directs the Intrinsics 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'>X Window
+System Protocol</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, ":&lt;Key&gt;a" is distinct from ":&lt;Key&gt;A",
+and ":Shift&lt;Key&gt;A" is distinct from ":&lt;Key&gt;A".
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+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.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If a colon (:) is not specified,
+no standard modifiers are applied.
+Then, for example, "&lt;Key&gt;A" and "&lt;Key&gt;a" are equivalent.
+    </para>
+  </listitem>
+</itemizedlist>
+
+<para>
+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>
+
+<literallayout >
+No modifiers:                  None &lt;event&gt; detail
+Any modifiers:                 &lt;event&gt; detail
+Only these modifiers:          ! mod1 mod2 &lt;event&gt; detail
+These modifiers and any others:        mod1 mod2 &lt;event&gt; detail
+</literallayout>
+
+<para>
+The use of "None" for a modifier list is identical to the use
+of an exclamation point with no modifers.
+</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <colspec colwidth='1.0*' colname='c3'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Modifier</entry>
+      <entry>Abbreviation</entry>
+      <entry>Meaning</entry>
+    </row>
+  </thead>
+  <tbody>
+    <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>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+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>
+Because it is possible to associate arbitrary KeySyms with modifiers, the set of
+key modifiers is extensible.  The "@" &lt;keysym&gt; syntax means any
+modifier bit whose corresponding KeyCode contains the specified KeySym name.
+</para>
+
+<para>
+A modifier_list/KeySym combination in a translation matches a
+modifiers/KeyCode combination in an event in the following ways:
+</para>
+
+<orderedlist>
+  <listitem>
+    <para>
+If a colon (:) is used, the Intrinsics call the display's
+<xref linkend='XtKeyProc' xrefstyle='select: title'/>
+with the KeyCode and modifiers.
+To match, (<emphasis remap='I'>modifiers</emphasis> &amp; ~<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 Intrinsics 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 Intrinsics call the display's
+<xref linkend='XtKeyProc' xrefstyle='select: title'/>
+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.
+    </para>
+  </listitem>
+</orderedlist>
+
+<para><emphasis role='strong'>Event Types</emphasis></para>
+
+<para>
+The event-type field describes XEvent types.
+In addition to the standard
+Xlib symbolic event type names, the following event type synonyms
+are defined:
+</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Type</entry>
+      <entry>Meaning</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>Key</entry>
+      <entry><function>KeyPress</function></entry>
+    </row>
+    <row>
+      <entry>KeyDown</entry>
+      <entry><function>KeyPress</function></entry>
+    </row>
+    <row>
+      <entry>KeyUp</entry>
+      <entry><function>KeyRelease</function></entry>
+    </row>
+    <row>
+      <entry>BtnDown</entry>
+      <entry><function>ButtonPress</function></entry>
+    </row>
+    <row>
+      <entry>BtnUp</entry>
+      <entry><function>ButtonRelease</function></entry>
+    </row>
+    <row>
+      <entry>Motion</entry>
+      <entry><function>MotionNotify</function></entry>
+    </row>
+    <row>
+      <entry>PtrMoved</entry>
+      <entry><function>MotionNotify</function></entry>
+    </row>
+    <row>
+      <entry>MouseMoved</entry>
+      <entry><function>MotionNotify</function></entry>
+    </row>
+    <row>
+      <entry>Enter</entry>
+      <entry><function>EnterNotify</function></entry>
+    </row>
+    <row>
+      <entry>EnterWindow</entry>
+      <entry><function>EnterNotify</function></entry>
+    </row>
+    <row>
+      <entry>Leave</entry>
+      <entry><function>LeaveNotify</function></entry>
+    </row>
+    <row>
+      <entry>LeaveWindow</entry>
+      <entry><function>LeaveNotify</function></entry>
+    </row>
+    <row>
+      <entry>FocusIn</entry>
+      <entry><function>FocusIn</function></entry>
+    </row>
+    <row>
+      <entry>FocusOut</entry>
+      <entry><function>FocusOut</function></entry>
+    </row>
+    <row>
+      <entry>Keymap</entry>
+      <entry><function>KeymapNotify</function></entry>
+    </row>
+    <row>
+      <entry>Expose</entry>
+      <entry><function>Expose</function></entry>
+    </row>
+    <row>
+      <entry>GrExp</entry>
+      <entry><function>GraphicsExpose</function></entry>
+    </row>
+    <row>
+      <entry>NoExp</entry>
+      <entry><function>NoExpose</function></entry>
+    </row>
+    <row>
+      <entry>Visible</entry>
+      <entry><function>VisibilityNotify</function></entry>
+    </row>
+    <row>
+      <entry>Create</entry>
+      <entry><function>CreateNotify</function></entry>
+    </row>
+    <row>
+      <entry>Destroy</entry>
+      <entry><function>DestroyNotify</function></entry>
+    </row>
+    <row>
+      <entry>Unmap</entry>
+      <entry><function>UnmapNotify</function></entry>
+    </row>
+    <row>
+      <entry>Map</entry>
+      <entry><function>MapNotify</function></entry>
+    </row>
+    <row>
+      <entry>MapReq</entry>
+      <entry><function>MapRequest</function></entry>
+    </row>
+    <row>
+      <entry>Reparent</entry>
+      <entry><function>ReparentNotify</function></entry>
+    </row>
+    <row>
+      <entry>Configure</entry>
+      <entry><function>ConfigureNotify</function></entry>
+    </row>
+    <row>
+      <entry>ConfigureReq</entry>
+      <entry><function>ConfigureRequest</function></entry>
+    </row>
+    <row>
+      <entry>Grav</entry>
+      <entry><function>GravityNotify</function></entry>
+    </row>
+    <row>
+      <entry>ResReq</entry>
+      <entry><function>ResizeRequest</function></entry>
+    </row>
+    <row>
+      <entry>Circ</entry>
+      <entry><function>CirculateNotify</function></entry>
+    </row>
+    <row>
+      <entry>CircReq</entry>
+      <entry><function>CirculateRequest</function></entry>
+    </row>
+    <row>
+      <entry>Prop</entry>
+      <entry><function>PropertyNotify</function></entry>
+    </row>
+    <row>
+      <entry>SelClr</entry>
+      <entry><function>SelectionClear</function></entry>
+    </row>
+    <row>
+      <entry>SelReq</entry>
+      <entry><function>SelectionRequest</function></entry>
+    </row>
+    <row>
+      <entry>Select</entry>
+      <entry><function>SelectionNotify</function></entry>
+    </row>
+    <row>
+      <entry>Clrmap</entry>
+      <entry><function>ColormapNotify</function></entry>
+    </row>
+    <row>
+      <entry>Message</entry>
+      <entry><function>ClientMessage</function></entry>
+    </row>
+    <row>
+      <entry>Mapping</entry>
+      <entry><function>MappingNotify</function></entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>The supported abbreviations are:</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='3' align='left' rowsep='0' colsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <colspec colwidth='1.0*' colname='c3'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Abbreviation</entry>
+      <entry>Event Type</entry>
+      <entry>Including</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>Ctrl</entry>
+      <entry><function>KeyPress</function></entry>
+      <entry>with Control modifier</entry>
+    </row>
+    <row>
+      <entry>Meta</entry>
+      <entry><function>KeyPress</function></entry>
+      <entry>with Meta modifier</entry>
+    </row>
+    <row>
+      <entry>Shift</entry>
+      <entry><function>KeyPress</function></entry>
+      <entry>with Shift modifier</entry>
+    </row>
+    <row>
+      <entry>Btn1Down</entry>
+      <entry><function>ButtonPress</function></entry>
+      <entry>with Button1 detail</entry>
+    </row>
+    <row>
+      <entry>Btn1Up</entry>
+      <entry><function>ButtonRelease</function></entry>
+      <entry>with Button1 detail</entry>
+    </row>
+    <row>
+      <entry>Btn2Down</entry>
+      <entry><function>ButtonPress</function></entry>
+      <entry>with Button2 detail</entry>
+    </row>
+    <row>
+      <entry>Btn2Up</entry>
+      <entry><function>ButtonRelease</function></entry>
+      <entry>with Button2 detail</entry>
+    </row>
+    <row>
+      <entry>Btn3Down</entry>
+      <entry><function>ButtonPress</function></entry>
+      <entry>with Button3 detail</entry>
+    </row>
+    <row>
+      <entry>Btn3Up</entry>
+      <entry><function>ButtonRelease</function></entry>
+      <entry>with Button3 detail</entry>
+    </row>
+    <row>
+      <entry>Btn4Down</entry>
+      <entry><function>ButtonPress</function></entry>
+      <entry>with Button4 detail</entry>
+    </row>
+    <row>
+      <entry>Btn4Up</entry>
+      <entry><function>ButtonRelease</function></entry>
+      <entry>with Button4 detail</entry>
+    </row>
+    <row>
+      <entry>Btn5Down</entry>
+      <entry><function>ButtonPress</function></entry>
+      <entry>with Button5 detail</entry>
+    </row>
+    <row>
+      <entry>Btn5Up</entry>
+      <entry><function>ButtonRelease</function></entry>
+      <entry>with Button5 detail</entry>
+    </row>
+    <row>
+      <entry>BtnMotion</entry>
+      <entry><function>MotionNotify</function></entry>
+      <entry>with any button modifier</entry>
+    </row>
+    <row>
+      <entry>Btn1Motion</entry>
+      <entry><function>MotionNotify</function></entry>
+      <entry>with Button1 modifier</entry>
+    </row>
+    <row>
+      <entry>Btn2Motion</entry>
+      <entry><function>MotionNotify</function></entry>
+      <entry>with Button2 modifier</entry>
+    </row>
+    <row>
+      <entry>Btn3Motion</entry>
+      <entry><function>MotionNotify</function></entry>
+      <entry>with Button3 modifier</entry>
+    </row>
+    <row>
+      <entry>Btn4Motion</entry>
+      <entry><function>MotionNotify</function></entry>
+      <entry>with Button4 modifier</entry>
+    </row>
+    <row>
+      <entry>Btn5Motion</entry>
+      <entry><function>MotionNotify</function></entry>
+      <entry>with Button5 modifier</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+The detail field is event-specific and normally corresponds to the
+detail field of the corresponding event as described
+by <emphasis remap='I'>X Window System Protocol</emphasis>, Section 11.
+The detail field is supported for the following event types:
+</para>
+
+<informaltable frame='none'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='2' align='left' rowsep='0' colsep='0'>
+  <colspec colwidth='0.5*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <tbody>
+    <row>
+      <entry>KeyPress</entry>
+      <entry>KeySym from event <emphasis>detail</emphasis> (keycode)</entry>
+    </row>
+    <row>
+      <entry>KeyRelease</entry>
+      <entry>KeySym from event <emphasis>detail</emphasis> (keycode)</entry>
+    </row>
+    <row>
+      <entry>ButtonPress</entry>
+      <entry>button from event <emphasis>detail</emphasis></entry>
+    </row>
+    <row>
+      <entry>ButtonRelease</entry>
+      <entry>button from event <emphasis>detail</emphasis></entry>
+    </row>
+    <row>
+      <entry>MotionNotify</entry>
+      <entry>event <emphasis>detail</emphasis></entry>
+    </row>
+    <row>
+      <entry>EnterNotify</entry>
+      <entry>event <emphasis>mode</emphasis></entry>
+    </row>
+    <row>
+      <entry>LeaveNotify</entry>
+      <entry>event <emphasis>mode</emphasis></entry>
+    </row>
+    <row>
+      <entry>FocusIn</entry>
+      <entry>event <emphasis>mode</emphasis></entry>
+    </row>
+    <row>
+      <entry>FocusOut</entry>
+      <entry>event <emphasis>mode</emphasis></entry>
+    </row>
+    <row>
+      <entry>PropertyNotify</entry>
+      <entry><emphasis>atom</emphasis></entry>
+    </row>
+    <row>
+      <entry>SelectionClear</entry>
+      <entry><emphasis>selection</emphasis></entry>
+    </row>
+    <row>
+      <entry>SelectionRequest</entry>
+      <entry><emphasis>selection</emphasis></entry>
+    </row>
+    <row>
+      <entry>SelectionNotify</entry>
+      <entry><emphasis>selection</emphasis></entry>
+    </row>
+    <row>
+      <entry>ClientMessage</entry>
+      <entry><emphasis>type</emphasis></entry>
+    </row>
+    <row>
+      <entry>MappingNotify</entry>
+      <entry><emphasis>request</emphasis></entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+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, &lt;Key&gt;A.
+</para>
+
+<para>
+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, &lt;Message&gt;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'>X Window
+System Protocol</emphasis>, Section 11,
+or the numeric values may be specified.
+</para>
+
+<para>
+If no detail field is specified, then any value in the event detail is
+accepted as a match.
+</para>
+
+<para>
+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>&lt;X11/keysymdef.h&gt;</function>
+with the "XK_" prefix removed.
+</para>
+
+<para><emphasis role='strong'>Canonical Representation</emphasis></para>
+
+<para>
+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")
+</para>
+
+<informaltable frame='none'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='0.2*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <tbody>
+    <row>
+      <entry>translationTable</entry>
+      <entry>= { production }
+      </entry>
+    </row>
+    <row>
+      <entry>production</entry>
+      <entry>= lhs ":" rhs "\\n"
+      </entry>
+    </row>
+    <row>
+      <entry>lhs</entry>
+      <entry>=event { "," event }
+      </entry>
+    </row>
+    <row>
+      <entry>event</entry>
+      <entry>=[modifier_list] "&lt;"event_type"&gt;" [ "(" count["+"] ")" ] {detail}
+      </entry>
+    </row>
+    <row>
+      <entry>modifier_list</entry>
+      <entry>= ["!"] [":"] {modifier}
+      </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>= "@" &lt;keysym&gt; | &lt;see canonical modifier names below&gt;
+      </entry>
+    </row>
+    <row>
+      <entry>event_type</entry>
+      <entry>= &lt;see canonical event types below&gt;
+      </entry>
+    </row>
+    <row>
+      <entry>detail</entry>
+      <entry>=&lt;event-specific details&gt;
+      </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
+      </entry>
+    </row>
+    <row>
+      <entry>quoted_string</entry>
+      <entry>= <quote>"</quote> {&lt;Latin 1 character&gt; | escape_char} ["\\\\" ] <quote>"</quote>
+      </entry>
+    </row>
+    <row>
+      <entry>escape_char</entry>
+      <entry>= "\\""
+      </entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>The canonical modifier names are</para>
+
+<literallayout >
+     Ctrl     Mod1         Button1
+     Shift    Mod2         Button2
+     Lock     Mod3         Button3
+     Mod4     Button4
+     Mod5     Button5
+</literallayout>
+
+<para>The canonical event types are</para>
+
+<informaltable frame='none'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <tbody>
+    <row>
+      <entry>KeyPress</entry>
+      <entry>KeyRelease</entry>
+    </row>
+    <row>
+      <entry>ButtonPress</entry>
+      <entry>ButtonRelease</entry>
+    </row>
+    <row>
+      <entry>MotionNotify</entry>
+      <entry>EnterNotify</entry>
+    </row>
+    <row>
+      <entry>LeaveNotify</entry>
+      <entry>FocusIn</entry>
+    </row>
+    <row>
+      <entry>FocusOut</entry>
+      <entry>KeymapNotify</entry>
+    </row>
+    <row>
+      <entry>Expose</entry>
+      <entry>GraphicsExpose,</entry>
+    </row>
+    <row>
+      <entry>NoExpose</entry>
+      <entry>VisibilityNotify</entry>
+    </row>
+    <row>
+      <entry>CreateNotify</entry>
+      <entry>DestroyNotify</entry>
+    </row>
+    <row>
+      <entry>UnmapNotify</entry>
+      <entry>MapNotify</entry>
+    </row>
+    <row>
+      <entry>MapRequest</entry>
+      <entry>ReparentNotify</entry>
+    </row>
+    <row>
+      <entry>ConfigureNotify</entry>
+      <entry>ConfigureRequest</entry>
+    </row>
+    <row>
+      <entry>GravityNotify</entry>
+      <entry>ResizeRequest</entry>
+    </row>
+    <row>
+      <entry>CirculateNotify</entry>
+      <entry>CirculateRequest</entry>
+    </row>
+    <row>
+      <entry>PropertyNotify</entry>
+      <entry>SelectionClear</entry>
+    </row>
+    <row>
+      <entry>SelectionRequest</entry>
+      <entry>SelectionNotify</entry>
+    </row>
+    <row>
+      <entry>ColormapNotify</entry>
+      <entry>ClientMessage</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para><emphasis role='strong'>Examples</emphasis></para>
+
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+Always put more specific events in the table before more general ones:
+    </para>
+<literallayout >
+    Shift &lt;Btn1Down&gt; : twas()\n\
+    &lt;Btn1Down&gt; : brillig()
+</literallayout>
+  </listitem>
+  <listitem>
+    <para>
+For double-click on Button1 Up with Shift, use this specification:
+    </para>
+    <literallayout >
+Shift&lt;Btn1Up&gt;(2) : and()
+</literallayout>
+  </listitem>
+  <listitem>
+    <para>
+This is equivalent to the following line with appropriate timers set
+between events:
+    </para>
+    <literallayout >
+Shift&lt;Btn1Down&gt;,Shift&lt;Btn1Up&gt;,Shift&lt;Btn1Down&gt;,Shift&lt;Btn1Up&gt; : and()
+</literallayout>
+  </listitem>
+  <listitem>
+    <para>
+For double-click on Button1 Down with Shift, use this specification:
+    </para>
+    <literallayout >
+Shift&lt;Btn1Down&gt;(2) : the()
+</literallayout>
+  </listitem>
+  <listitem>
+    <para>
+This is equivalent to the following line with appropriate timers set
+between events:
+    </para>
+    <literallayout >
+Shift&lt;Btn1Down&gt;,Shift&lt;Btn1Up&gt;,Shift&lt;Btn1Down&gt; : the()
+</literallayout>
+  </listitem>
+  <listitem>
+    <para>
+Mouse motion is always discarded when it occurs between events in a table
+where no motion event is specified:
+    </para>
+    <literallayout >
+&lt;Btn1Down&gt;,&lt;Btn1Up&gt; : slithy()
+</literallayout>
+    <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>
+    <literallayout >
+&lt;Btn1Down&gt;,&lt;Btn1Up&gt; : toves()\n\
+&lt;Btn1Up&gt; :  did()
+</literallayout>
+    <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>
+    <literallayout >
+Shift Meta &lt;Btn1Down&gt;, Shift Meta&lt;Btn1Up&gt;: gyre()
+</literallayout>
+  </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>
+    <literallayout >
+Shift &lt;Btn1Up&gt;(2+) : and()
+</literallayout>
+  </listitem>
+  <listitem>
+    <para>
+To indicate
+<function>EnterNotify</function>
+with any modifiers, use this specification:
+    </para>
+    <literallayout >
+&lt;Enter&gt; : gimble()
+</literallayout>
+  </listitem>
+  <listitem>
+    <para>
+To indicate
+<function>EnterNotify</function>
+with no modifiers, use this specification:
+    </para>
+    <literallayout >
+None &lt;Enter&gt; : in()
+</literallayout>
+  </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>
+    <literallayout >
+Button1 ~Button2 &lt;Enter&gt; : the()
+</literallayout>
+  </listitem>
+  <listitem>
+    <para>
+To indicate
+<function>EnterNotify</function>
+with Button1 down and Button2 down exclusively, use this specification:
+    </para>
+    <literallayout >
+! Button1 Button2 &lt;Enter&gt; : wabe()
+</literallayout>
+    <para>
+You do not need to use a tilde (~) with an exclamation point (!).
+    </para>
+  </listitem>
+</itemizedlist>
+</appendix>
diff --git a/specs/appC.xml b/specs/appC.xml
new file mode 100644 (file)
index 0000000..4598ac9
--- /dev/null
@@ -0,0 +1,1970 @@
+<appendix id='Compability_Functions'>
+<title>Compatibility Functions
+<footnote>
+<para>
+This appendix is part of the formal Intrinsics Specification.
+</para>
+</footnote>
+</title>
+<para>
+In prototype versions of the X Toolkit
+each widget class
+implemented an Xt&lt;<emphasis remap='I'>Widget</emphasis>&gt;Create (for example,
+<function>XtLabelCreate</function>)
+function, in which most of the code was identical from widget to widget.
+In the Intrinsics, a single generic
+<xref linkend='XtCreateWidget' xrefstyle='select: title'/>
+performs most of the common work and then calls the initialize procedure
+implemented for the particular widget class.
+</para>
+
+<para>
+Each Composite class also implemented the procedures
+Xt&lt;<emphasis remap='I'>Widget</emphasis>&gt;Add and an Xt&lt;<emphasis remap='I'>Widget</emphasis>&gt;Delete (for example,
+<function>XtButtonBoxAddButton</function>
+and
+<function>XtButtonBoxDeleteButton</function>).
+In the Intrinsics, the Composite generic procedures
+<xref linkend='XtManageChildren' xrefstyle='select: title'/>
+and
+<xref linkend='XtUnmanageChildren' xrefstyle='select: title'/>
+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>
+Old-style calls can be implemented in the X Toolkit by defining
+one-line procedures or macros that invoke a generic routine.  For example,
+you could define the macro
+<function>XtLabelCreate</function>
+as:
+</para>
+
+<literallayout>
+#define XtLabelCreate(name, parent, args, num_args) \
+   ((LabelWidget) XtCreateWidget(name, labelWidgetClass, parent, args, num_args))
+</literallayout>
+
+<para>
+Pop-up shells in some of the prototypes automatically performed an
+<xref linkend='XtManageChild' xrefstyle='select: title'/>
+on their child within their insert_child procedure.
+Creators of pop-up children need to call
+<xref linkend='XtManageChild' xrefstyle='select: title'/>
+themselves.
+</para>
+
+<para>
+<xref linkend='XtAppInitialize' xrefstyle='select: title'/>
+and
+<xref linkend='XtVaAppInitialize' xrefstyle='select: title'/>
+have been replaced by
+<xref linkend='XtOpenApplication' xrefstyle='select: title'/>
+and
+<xref linkend='XtVaOpenApplication' xrefstyle='select: title'/>.
+</para>
+
+<para>
+To initialize the Intrinsics internals, create an application context,
+open and initialize a display, and create the initial application shell
+instance, an application may use
+<xref linkend='XtAppInitialize' xrefstyle='select: title'/>
+or
+<xref linkend='XtVaAppInitialize' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppInitialize'>
+<funcprototype>
+<funcdef>Widget <function>XtAppInitialize</function></funcdef>
+   <paramdef>XtAppContext *<parameter>app_context_return</parameter></paramdef>
+   <paramdef>String <parameter>application_class</parameter></paramdef>
+   <paramdef>XrmOptionDescList <parameter>options</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_options</parameter></paramdef>
+   <paramdef>int *<parameter>argc_in_out</parameter></paramdef>
+   <paramdef>String *<parameter>argv_in_out</parameter></paramdef>
+   <paramdef>String *<parameter>fallback_resources</parameter></paramdef>
+   <paramdef>ArgList <parameter>args</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_args</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtAppInitialize' xrefstyle='select: title'/>
+function calls
+<xref linkend='XtToolkitInitialize' xrefstyle='select: title'/>
+followed by
+<xref linkend='XtCreateApplicationContext' xrefstyle='select: title'/>,
+then calls
+<xref linkend='XtOpenDisplay' xrefstyle='select: title'/>
+with <emphasis remap='I'>display_string</emphasis> NULL and
+<emphasis remap='I'>application_name</emphasis> NULL, and finally calls
+<xref linkend='XtAppCreateShell' xrefstyle='select: title'/>
+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
+<xref linkend='XtDisplayInitialize' xrefstyle='select: title'/>
+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
+<xref linkend='XtAppInitialize' xrefstyle='select: title'/>
+terminates the application.  If <emphasis remap='I'>fallback_resources</emphasis> is non-NULL,
+<xref linkend='XtAppSetFallbackResources' xrefstyle='select: title'/>
+is called with the value prior to calling
+<xref linkend='XtOpenDisplay' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtVaAppInitialize'>
+<funcprototype>
+<funcdef>Widget <function>XtVaAppInitialize</function></funcdef>
+   <paramdef>XtAppContext *<parameter>app_context_return</parameter></paramdef>
+   <paramdef>String <parameter>application_class</parameter></paramdef>
+   <paramdef>XrmOptionDescList <parameter>options</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_options</parameter></paramdef>
+   <paramdef>int *<parameter>argc_in_out</parameter></paramdef>
+   <paramdef>String *<parameter>argv_in_out</parameter></paramdef>
+   <paramdef>String *<parameter>fallback_resources</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtVaAppInitialize' xrefstyle='select: title'/>
+procedure is identical in function to
+<xref linkend='XtAppInitialize' xrefstyle='select: title'/>
+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>
+
+<para>
+As a convenience to people converting from earlier versions of the toolkit
+without application contexts, the following routines exist:
+<xref linkend='XtInitialize' xrefstyle='select: title'/>,
+<xref linkend='XtMainLoop' xrefstyle='select: title'/>,
+<xref linkend='XtNextEvent' xrefstyle='select: title'/>,
+<xref linkend='XtProcessEvent' xrefstyle='select: title'/>,
+<xref linkend='XtPeekEvent' xrefstyle='select: title'/>,
+<xref linkend='XtPending' xrefstyle='select: title'/>,
+<xref linkend='XtAddInput' xrefstyle='select: title'/>,
+<xref linkend='XtAddTimeOut' xrefstyle='select: title'/>,
+<xref linkend='XtAddWorkProc' xrefstyle='select: title'/>,
+<xref linkend='XtCreateApplicationShell' xrefstyle='select: title'/>,
+<xref linkend='XtAddActions' xrefstyle='select: title'/>,
+<xref linkend='XtSetSelectionTimeout' xrefstyle='select: title'/>,
+and
+<xref linkend='XtGetSelectionTimeout' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtInitialize'>
+<funcprototype>
+<funcdef>Widget <function>XtInitialize</function></funcdef>
+   <paramdef>String <parameter>shell_name</parameter></paramdef>
+   <paramdef>String <parameter>application_class</parameter></paramdef>
+   <paramdef>XrmOptionDescRec <parameter>options</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_options</parameter></paramdef>
+   <paramdef>int *<parameter>argc</parameter></paramdef>
+   <paramdef>String <parameter>argv</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+<xref linkend='XtInitialize' xrefstyle='select: title'/>
+calls
+<xref linkend='XtToolkitInitialize' xrefstyle='select: title'/>
+to initialize the toolkit internals,
+creates a default application context for use by the other convenience
+routines, calls
+<xref linkend='XtOpenDisplay' xrefstyle='select: title'/>
+with <emphasis remap='I'>display_string</emphasis> NULL and <emphasis remap='I'>application_name</emphasis> NULL, and
+finally calls
+<xref linkend='XtAppCreateShell' xrefstyle='select: title'/>
+with <emphasis remap='I'>application_name</emphasis> NULL and
+returns the created shell.
+The semantics of calling
+<xref linkend='XtInitialize' xrefstyle='select: title'/>
+more than once are undefined.
+This routine has been replaced by
+<xref linkend='XtOpenApplication' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtMainLoop'>
+<funcprototype>
+<funcdef>void <function>XtMainLoop</function></funcdef>
+   <paramdef><parameter>void</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+<xref linkend='XtMainLoop' xrefstyle='select: title'/>
+first reads the next alternate input, timer, or X event by calling
+<xref linkend='XtNextEvent' xrefstyle='select: title'/>.
+Then it dispatches this to the appropriate registered procedure by calling
+<xref linkend='XtDispatchEvent' xrefstyle='select: title'/>.
+This routine has been replaced by
+<xref linkend='XtAppMainLoop' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtNextEvent'>
+<funcprototype>
+<funcdef>void <function>XtNextEvent</function></funcdef>
+   <paramdef>XEvent *<parameter>event_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+If no input is on the X input queue for the default application context,
+<xref linkend='XtNextEvent' xrefstyle='select: title'/>
+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
+<xref linkend='XtAppNextEvent' xrefstyle='select: title'/>.
+<xref linkend='XtInitialize' xrefstyle='select: title'/>
+must be called before using this routine.
+</para>
+
+<funcsynopsis id='XtProcessEvent'>
+<funcprototype>
+<funcdef>void <function>XtProcessEvent</function></funcdef>
+   <paramdef>XtInputMask <parameter>mask</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>mask</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the type of input to process.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<xref linkend='XtProcessEvent' xrefstyle='select: title'/>
+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
+<xref linkend='XtAppProcessEvent' xrefstyle='select: title'/>.
+<xref linkend='XtInitialize' xrefstyle='select: title'/>
+must be called before using this function.
+</para>
+
+<funcsynopsis id='XtPeekEvent'>
+<funcprototype>
+<funcdef>Boolean <function>XtPeekEvent</function></funcdef>
+   <paramdef>XEvent *<parameter>event_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+If there is an event in the queue for the default application context,
+<xref linkend='XtPeekEvent' xrefstyle='select: title'/>
+fills in the event and returns a nonzero value.
+If no X input is on the queue,
+<xref linkend='XtPeekEvent' xrefstyle='select: title'/>
+flushes the output buffer and blocks until input is available, possibly
+calling some timeout callbacks in the process.
+If the input is an event,
+<xref linkend='XtPeekEvent' xrefstyle='select: title'/>
+fills in the event and returns a nonzero value.
+Otherwise, the input is for an alternate input source, and
+<xref linkend='XtPeekEvent' xrefstyle='select: title'/>
+returns zero.
+This routine has been replaced by
+<xref linkend='XtAppPeekEvent' xrefstyle='select: title'/>.
+<xref linkend='XtInitialize' xrefstyle='select: title'/>
+must be called before using this routine.
+</para>
+
+<funcsynopsis id='XtPending'>
+<funcprototype>
+<funcdef>Boolean <function>XtPending</function></funcdef>
+  <paramdef><parameter></parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+<xref linkend='XtPending' xrefstyle='select: title'/>
+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
+<xref linkend='XtAppPending' xrefstyle='select: title'/>.
+<xref linkend='XtInitialize' xrefstyle='select: title'/>
+must be called before using this routine.
+</para>
+
+<funcsynopsis id='XtAddInput'>
+<funcprototype>
+<funcdef>XtInputId <function>XtAddInput</function></funcdef>
+   <paramdef>int <parameter>source</parameter></paramdef>
+   <paramdef>XtPointer <parameter>condition</parameter></paramdef>
+   <paramdef>XtInputCallbackProc <parameter>proc</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtAddInput' xrefstyle='select: title'/>
+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.)
+<xref linkend='XtAddInput' xrefstyle='select: title'/>
+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
+<xref linkend='XtAppAddInput' xrefstyle='select: title'/>.
+<xref linkend='XtInitialize' xrefstyle='select: title'/>
+must be called before using this routine.
+</para>
+
+<funcsynopsis id='XtAddTimeOut'>
+<funcprototype>
+<funcdef>XtIntervalId <function>XtAddTimeOut</function></funcdef>
+      <paramdef>unsigned long <parameter>interval</parameter></paramdef>
+   <paramdef>XtTimerCallbackProc <parameter>proc</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtAddTimeOut' xrefstyle='select: title'/>
+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
+<xref linkend='XtAppAddTimeOut' xrefstyle='select: title'/>.
+<xref linkend='XtInitialize' xrefstyle='select: title'/>
+must be called before using this routine.
+</para>
+
+<funcsynopsis id='XtAddWorkProc'>
+<funcprototype>
+<funcdef>XtWorkProcId <function>XtAddWorkProc</function></funcdef>
+   <paramdef>XtWorkProc <parameter>proc</parameter></paramdef>
+   <paramdef>XtPointer <parameter>client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+This routine registers a work procedure in the default application context. It has
+been replaced by
+<xref linkend='XtAppAddWorkProc' xrefstyle='select: title'/>.
+<xref linkend='XtInitialize' xrefstyle='select: title'/>
+must be called before using this routine.
+</para>
+
+<funcsynopsis id='XtCreateApplicationShell'>
+<funcprototype>
+<funcdef>Widget <function>XtCreateApplicationShell</function></funcdef>
+   <paramdef>String <parameter>name</parameter></paramdef>
+   <paramdef>WidgetClass <parameter>widget_class</parameter></paramdef>
+   <paramdef>ArgList <parameter>args</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_args</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The procedure
+<xref linkend='XtCreateApplicationShell' xrefstyle='select: title'/>
+calls
+<xref linkend='XtAppCreateShell' xrefstyle='select: title'/>
+with <emphasis remap='I'>application_name</emphasis> NULL, the application class passed to
+<xref linkend='XtInitialize' xrefstyle='select: title'/>,
+and the default application context created by
+<xref linkend='XtInitialize' xrefstyle='select: title'/>.
+This routine has been replaced by
+<xref linkend='XtAppCreateShell' xrefstyle='select: title'/>.
+</para>
+
+<para>
+An old-format resource type converter procedure pointer is of type
+<xref linkend='XtConverter' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtConverter'>
+<funcprototype>
+<funcdef>typedef void <function>(*XtConverter)</function></funcdef>
+
+   <paramdef>XrmValue *<parameter>args</parameter></paramdef>
+   <paramdef>Cardinal *<parameter>num_args</parameter></paramdef>
+   <paramdef>XrmValue *<parameter>from</parameter></paramdef>
+   <paramdef>XrmValue *<parameter>to</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+Type converters should perform the following actions:
+</para>
+<itemizedlist spacing='compact'>
+  <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
+<xref linkend='XtWarningMsg' xrefstyle='select: title'/>
+and return without modifying the <emphasis remap='I'>to</emphasis> argument.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+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>
+Note that the address returned in <emphasis remap='I'>to-&gt;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>
+The procedure type
+<xref linkend='XtConverter' xrefstyle='select: title'/>
+has been replaced by
+<xref linkend='XtTypeConverter' xrefstyle='select: title'/>.
+</para>
+
+<para>
+The
+<xref linkend='XtStringConversionWarning' xrefstyle='select: title'/>
+function is a convenience routine for old-format resource converters
+that convert from strings.
+</para>
+
+<funcsynopsis id='XtStringConversionWarning'>
+<funcprototype>
+<funcdef>void <function>XtStringConversionWarning</function></funcdef>
+   <paramdef>String <parameter>src</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtStringConversionWarning' xrefstyle='select: title'/>
+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
+<xref linkend='XtDisplayStringConversionWarning' xrefstyle='select: title'/>.
+</para>
+
+<para>
+To register an old-format converter, use
+<xref linkend='XtAddConverter' xrefstyle='select: title'/>
+or
+<xref linkend='XtAppAddConverter' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAddConverter'>
+<funcprototype>
+<funcdef>void <function>XtAddConverter</function></funcdef>
+   <paramdef>String <parameter>from_type</parameter></paramdef>
+   <paramdef>String <parameter>to_type</parameter></paramdef>
+   <paramdef>XtConverter <parameter>converter</parameter></paramdef>
+   <paramdef>XtConvertArgList <parameter>convert_args</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_args</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<xref linkend='XtAddConverter' xrefstyle='select: title'/>
+is equivalent in function to
+<xref linkend='XtSetTypeConverter' xrefstyle='select: title'/>
+with <emphasis remap='I'>cache_type</emphasis> equal to
+<function>XtCacheAll</function>
+for old-format type converters.  It has been superseded by
+<xref linkend='XtSetTypeConverter' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAppAddConverter'>
+<funcprototype>
+<funcdef>void <function>XtAppAddConverter</function></funcdef>
+   <paramdef>XtAppContext <parameter>app_context</parameter></paramdef>
+   <paramdef>String <parameter>from_type</parameter></paramdef>
+   <paramdef>String <parameter>to_type</parameter></paramdef>
+   <paramdef>XtConverter <parameter>converter</parameter></paramdef>
+   <paramdef>XtConvertArgList <parameter>convert_args</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_args</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+<xref linkend='XtAppAddConverter' xrefstyle='select: title'/>
+is equivalent in function to
+<xref linkend='XtAppSetTypeConverter' xrefstyle='select: title'/>
+with <emphasis remap='I'>cache_type</emphasis> equal to
+<function>XtCacheAll</function>
+for old-format type converters.  It has been superseded by
+<xref linkend='XtAppSetTypeConverter' xrefstyle='select: title'/>.
+</para>
+
+<para>
+To invoke resource conversions, a client may use
+<xref linkend='XtConvert' xrefstyle='select: title'/>
+or, for old-format converters only,
+<xref linkend='XtDirectConvert' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtConvert'>
+<funcprototype>
+<funcdef>void <function>XtConvert</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>String <parameter>from_type</parameter></paramdef>
+   <paramdef>XrmValuePtr <parameter>from</parameter></paramdef>
+   <paramdef>String <parameter>to_type</parameter></paramdef>
+   <paramdef>XrmValuePtr <parameter>to_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+
+
+<funcsynopsis id='XtDirectConvert'>
+<funcprototype>
+<funcdef>void <function>XtDirectConvert</function></funcdef>
+   <paramdef>XtConverter <parameter>converter</parameter></paramdef>
+   <paramdef>XrmValuePtr <parameter>args</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_args</parameter></paramdef>
+   <paramdef>XrmValuePtr <parameter>from</parameter></paramdef>
+   <paramdef>XrmValuePtr <parameter>to_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The
+<xref linkend='XtConvert' xrefstyle='select: title'/>
+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
+<xref linkend='XtDirectConvert' xrefstyle='select: title'/>
+or
+<xref linkend='XtCallConverter' xrefstyle='select: title'/>.
+The
+<xref linkend='XtDirectConvert' xrefstyle='select: title'/>
+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>
+Before calling the specified converter,
+<xref linkend='XtDirectConvert' xrefstyle='select: title'/>
+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
+<xref linkend='XtConvert' xrefstyle='select: title'/>
+must be copied immediately by the caller,
+as it may point to static data in the type converter.
+</para>
+
+<para>
+<xref linkend='XtConvert' xrefstyle='select: title'/>
+has been replaced by
+<xref linkend='XtConvertAndStore' xrefstyle='select: title'/>,
+and
+<xref linkend='XtDirectConvert' xrefstyle='select: title'/>
+has been superseded by
+<xref linkend='XtCallConverter' xrefstyle='select: title'/>.
+</para>
+
+<para>
+To deallocate a shared GC when it is no longer needed, use
+<xref linkend='XtDestroyGC' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtDestroyGC'>
+<funcprototype>
+<funcdef>void <function>XtDestroyGC</function></funcdef>
+   <paramdef>Widget <parameter>w</parameter></paramdef>
+   <paramdef>GC <parameter>gc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies any object on the display for which the shared GC was
+created.  Must be of class Object or any subclass thereof.
+      </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>
+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
+<xref linkend='XtDestroyGC' xrefstyle='select: title'/>
+had only a <emphasis remap='I'>gc</emphasis> argument.
+Therefore, this function is not very portable,
+and you are encouraged to use
+<xref linkend='XtReleaseGC' xrefstyle='select: title'/>
+instead.
+</para>
+
+<para>
+To declare an action table in the default application context
+and register it with the translation manager, use
+<xref linkend='XtAddActions' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtAddActions'>
+<funcprototype>
+<funcdef>void <function>XtAddActions</function></funcdef>
+   <paramdef>XtActionList <parameter>actions</parameter></paramdef>
+   <paramdef>Cardinal <parameter>num_actions</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+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 Intrinsics register an action table for
+<xref linkend='XtMenuPopup' xrefstyle='select: title'/>
+and
+<xref linkend='XtMenuPopdown' xrefstyle='select: title'/>
+as part of X Toolkit initialization.
+This routine has been replaced by
+<xref linkend='XtAppAddActions' xrefstyle='select: title'/>.
+<xref linkend='XtInitialize' xrefstyle='select: title'/>
+must be called before using this routine.
+</para>
+
+<para>
+To set the Intrinsics selection timeout in the default application context, use
+<xref linkend='XtSetSelectionTimeout' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtSetSelectionTimeout'>
+<funcprototype>
+<funcdef>void <function>XtSetSelectionTimeout</function></funcdef>
+      <paramdef>unsigned long <parameter>timeout</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>timeout</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the selection timeout in milliseconds.
+This routine has been replaced by
+<xref linkend='XtAppSetSelectionTimeout' xrefstyle='select: title'/>.
+<xref linkend='XtInitialize' xrefstyle='select: title'/>
+must be called before using this routine.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+
+<para>
+To get the current selection timeout value in the default application
+context, use
+<xref linkend='XtGetSelectionTimeout' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtGetSelectionTimeout'>
+<funcprototype>
+<funcdef>unsigned long <function>XtGetSelectionTimeout</function></funcdef>
+      <paramdef><parameter></parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+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 Intrinsics abort the selection request.
+</para>
+
+<para>
+This routine has been replaced by
+<xref linkend='XtAppGetSelectionTimeout' xrefstyle='select: title'/>.
+<xref linkend='XtInitialize' xrefstyle='select: title'/>
+must be called before using this routine.
+</para>
+
+<para>
+To obtain the global error database (for example, to merge with
+an application- or widget-specific database), use
+<xref linkend='XtGetErrorDatabase' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtGetErrorDatabase'>
+<funcprototype>
+<funcdef>XrmDatabase <function>*XtGetErrorDatabase</function></funcdef>
+      <paramdef><parameter></parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+  
+<para>
+The
+<xref linkend='XtGetErrorDatabase' xrefstyle='select: title'/>
+function returns the address of the error database.
+The Intrinsics 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
+<xref linkend='XtAppGetErrorDatabase' xrefstyle='select: title'/>.
+</para>
+
+<para>
+An error message handler can obtain the error database text for an
+error or a warning by calling
+<xref linkend='XtGetErrorDatabaseText' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtGetErrorDatabaseText'>
+<funcprototype>
+<funcdef>void <function>XtGetErrorDatabaseText</function></funcdef>
+   <paramdef>String <parameter>name</parameter></paramdef>
+   <paramdef>String <parameter>default</parameter></paramdef>
+   <paramdef>String <parameter>buffer_return</parameter></paramdef>
+   <paramdef>int <parameter>nbytes</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>name</emphasis>
+    </term>
+    <listitem>
+      <para></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>
+The
+<xref linkend='XtGetErrorDatabaseText' xrefstyle='select: title'/>
+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
+<xref linkend='XtAppGetErrorDatabaseText' xrefstyle='select: title'/>.
+</para>
+
+<para>
+To register a procedure to be called on fatal error conditions, use
+<xref linkend='XtSetErrorMsgHandler' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtSetErrorMsgHandler'>
+<funcprototype>
+<funcdef>void <function>XtSetErrorMsgHandler</function></funcdef>
+   <paramdef>XtErrorMsgHandler <parameter>msg_handler</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The default error handler provided by the Intrinsics constructs a
+string from the error resource database and calls
+<xref linkend='XtError' xrefstyle='select: title'/>.
+Fatal error message handlers should not return.
+If one does,
+subsequent Intrinsics behavior is undefined.
+This routine has been superseded by
+<xref linkend='XtAppSetErrorMsgHandler' xrefstyle='select: title'/>.
+</para>
+
+<para>
+To call the high-level error handler, use
+<xref linkend='XtErrorMsg' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtErrorMsg'>
+<funcprototype>
+<funcdef>void <function>XtErrorMsg</function></funcdef>
+   <paramdef>String <parameter>name</parameter></paramdef>
+   <paramdef>String <parameter>type</parameter></paramdef>
+   <paramdef>String <parameter>class</parameter></paramdef>
+   <paramdef>String <parameter>default</parameter></paramdef>
+   <paramdef>String *<parameter>params</parameter></paramdef>
+   <paramdef>Cardinal *<parameter>num_params</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+This routine has been superseded by
+<xref linkend='XtAppErrorMsg' xrefstyle='select: title'/>.
+</para>
+
+<para>
+To register a procedure to be called on nonfatal error conditions, use
+<xref linkend='XtSetWarningMsgHandler' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtSetWarningMsgHandler'>
+<funcprototype>
+<funcdef>void <function>XtSetWarningMsgHandler</function></funcdef>
+   <paramdef>XtErrorMsgHandler <parameter>msg_handler</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The default warning handler provided by the Intrinsics constructs a string
+from the error resource database and calls
+<xref linkend='XtWarning' xrefstyle='select: title'/>.
+This routine has been superseded by
+<xref linkend='XtAppSetWarningMsgHandler' xrefstyle='select: title'/>.
+</para>
+
+<para>
+To call the installed high-level warning handler, use
+<xref linkend='XtWarningMsg' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtWarningMsg'>
+<funcprototype>
+<funcdef>void <function>XtWarningMsg</function></funcdef>
+   <paramdef>String <parameter>name</parameter></paramdef>
+   <paramdef>String <parameter>type</parameter></paramdef>
+   <paramdef>String <parameter>class</parameter></paramdef>
+   <paramdef>String <parameter>default</parameter></paramdef>
+   <paramdef>String *<parameter>params</parameter></paramdef>
+   <paramdef>Cardinal *<parameter>num_params</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+This routine has been superseded by
+<xref linkend='XtAppWarningMsg' xrefstyle='select: title'/>.
+</para>
+
+<para>
+To register a procedure to be called on fatal error conditions, use
+<xref linkend='XtSetErrorHandler' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtSetErrorHandler'>
+<funcprototype>
+<funcdef>void <function>XtSetErrorHandler</function></funcdef>
+   <paramdef>XtErrorHandler <parameter>handler</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The default error handler provided by the Intrinsics 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 X Toolkit behavior is undefined.
+This routine has been superseded by
+<xref linkend='XtAppSetErrorHandler' xrefstyle='select: title'/>.
+</para>
+
+<para>
+To call the installed fatal error procedure, use
+<xref linkend='XtError' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtError'>
+<funcprototype>
+<funcdef>void <function>XtError</function></funcdef>
+   <paramdef>String <parameter>message</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>message</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the message to be reported.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+Most programs should use
+<xref linkend='XtAppErrorMsg' xrefstyle='select: title'/>,
+not
+<xref linkend='XtError' xrefstyle='select: title'/>,
+to provide for customization and internationalization of error
+messages.  This routine has been superseded by
+<xref linkend='XtAppError' xrefstyle='select: title'/>.
+</para>
+
+<para>
+To register a procedure to be called on nonfatal error conditions, use
+<xref linkend='XtSetWarningHandler' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtSetWarningHandler'>
+<funcprototype>
+<funcdef>void <function>XtSetWarningHandler</function></funcdef>
+   <paramdef>XtErrorHandler <parameter>handler</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<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>
+The default warning handler provided by the Intrinsics 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
+<xref linkend='XtAppSetWarningHandler' xrefstyle='select: title'/>.
+</para>
+
+<para>
+To call the installed nonfatal error procedure, use
+<xref linkend='XtWarning' xrefstyle='select: title'/>.
+</para>
+
+<funcsynopsis id='XtWarning'>
+<funcprototype>
+<funcdef>void <function>XtWarning</function></funcdef>
+   <paramdef>String <parameter>message</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>message</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the nonfatal error message to be reported.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+Most programs should use
+<xref linkend='XtAppWarningMsg' xrefstyle='select: title'/>,
+not
+<xref linkend='XtWarning' xrefstyle='select: title'/>,
+to provide for customization and internationalization of warning messages.
+This routine has been superseded by
+<xref linkend='XtAppWarning' xrefstyle='select: title'/>.
+</para>
+</appendix>
diff --git a/specs/appD.xml b/specs/appD.xml
new file mode 100644 (file)
index 0000000..00acbe7
--- /dev/null
@@ -0,0 +1,880 @@
+<appendix id='Intrinsics_Error_Messages'>
+<title>Intrinsics Error Messages</title>
+
+<para>
+All Intrinsics errors and warnings have class
+``XtToolkitError''.
+The following two tables summarize the common errors and warnings that can be
+generated by the Intrinsics.
+Additional implementation-dependent messages are permitted.
+Error Messages
+</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='3' align='left' rowsep='0' colsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <colspec colwidth='1.0*' colname='c3'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Name</entry>
+      <entry>Type</entry>
+      <entry>Default Message</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>allocError</entry>
+      <entry>calloc</entry>
+      <entry>Cannot perform calloc</entry>
+    </row>
+    <row>
+      <entry>allocError</entry>
+      <entry>malloc</entry>
+      <entry>Cannot perform malloc</entry>
+    </row>
+    <row>
+      <entry>allocError</entry>
+      <entry>realloc</entry>
+      <entry>Cannot perform realloc</entry>
+    </row>
+    <row>
+      <entry>internalError</entry>
+      <entry>xtMakeGeometryRequest</entry>
+      <entry>internal error; ShellClassExtension is NULL</entry>
+    </row>
+    <row>
+      <entry>invalidArgCount</entry>
+      <entry>xtGetValues</entry>
+      <entry>Argument count &gt; 0 on NULL argument list in XtGetValues</entry>
+    </row>
+    <row>
+      <entry>invalidArgCount</entry>
+      <entry>xtSetValues</entry>
+      <entry>Argument count &gt; 0 on NULL argument list in XtSetValues</entry>
+    </row>
+    <row>
+      <entry>invalidClass</entry>
+      <entry>applicationShellInsertChild</entry>
+      <entry>ApplicationShell does not accept RectObj children; ignored</entry>
+    </row>
+    <row>
+      <entry>invalidClass</entry>
+      <entry>constraintSetValue</entry>
+      <entry>Subclass of Constraint required in CallConstraintSetValues</entry>
+    </row>
+    <row>
+      <entry>invalidClass</entry>
+      <entry>xtAppCreateShell</entry>
+      <entry>XtAppCreateShell requires non-NULL widget class</entry>
+    </row>
+    <row>
+      <entry>invalidClass</entry>
+      <entry>xtCreatePopupShell</entry>
+      <entry>XtCreatePopupShell requires non-NULL widget class</entry>
+    </row>
+    <row>
+      <entry>invalidClass</entry>
+      <entry>xtCreateWidget</entry>
+      <entry>XtCreateWidget requires non-NULL widget class</entry>
+    </row>
+    <row>
+      <entry>invalidClass</entry>
+      <entry>xtPopdown</entry>
+      <entry>XtPopdown requires a subclass of shellWidgetClass</entry>
+    </row>
+    <row>
+      <entry>invalidClass</entry>
+      <entry>xtPopup</entry>
+      <entry>XtPopup requires a subclass of shellWidgetClass</entry>
+    </row>
+    <row>
+      <entry>invalidDimension</entry>
+      <entry>xtCreateWindow</entry>
+      <entry>Widget %s has zero width and/or height</entry>
+    </row>
+    <row>
+      <entry>invalidDimension</entry>
+      <entry>shellRealize</entry>
+      <entry>Shell widget %s has zero width and/or height</entry>
+    </row>
+    <row>
+      <entry>invalidDisplay</entry>
+      <entry>xtInitialize</entry>
+      <entry>Can't open display: %s</entry>
+    </row>
+    <row>
+      <entry>invalidGetValues</entry>
+      <entry>xtGetValues</entry>
+      <entry>NULL ArgVal in XtGetValues</entry>
+    </row>
+    <row>
+      <entry>invalidExtension</entry>
+      <entry>shellClassPartInitialize</entry>
+      <entry>widget class %s has invalid ShellClassExtension record</entry>
+    </row>
+    <row>
+      <entry>invalidExtension</entry>
+      <entry>xtMakeGeometryRequest</entry>
+      <entry>widget class %s has invalid ShellClassExtension record</entry>
+    </row>
+    <row>
+      <entry>invalidGeometryManager</entry>
+      <entry>xtMakeGeometryRequest</entry>
+      <entry>XtMakeGeometryRequest - parent has no geometry manager</entry>
+    </row>
+    <row>
+      <entry>invalidParameter</entry>
+      <entry>xtAddInput</entry>
+      <entry>invalid condition passed to XtAddInput</entry>
+    </row>
+    <row>
+      <entry>invalidParameter</entry>
+      <entry>xtAddInput</entry>
+      <entry>invalid condition passed to XtAppAddInput</entry>
+    </row>
+    <row>
+      <entry>invalidParent</entry>
+      <entry>xtChangeManagedSet</entry>
+      <entry>Attempt to manage a child when parent is not Composite</entry>
+    </row>
+    <row>
+      <entry>invalidParent</entry>
+      <entry>xtChangeManagedSet</entry>
+      <entry>Attempt to unmanage a child when parent is not Composite</entry>
+    </row>
+    <row>
+      <entry>invalidParent</entry>
+      <entry>xtCreatePopupShell</entry>
+      <entry>XtCreatePopupShell requires non-NULL parent</entry>
+    </row>
+    <row>
+      <entry>invalidParent</entry>
+      <entry>xtCreateWidget</entry>
+      <entry>XtCreateWidget requires non-NULL parent</entry>
+    </row>
+    <row>
+      <entry>invalidParent</entry>
+      <entry>xtMakeGeometryRequest</entry>
+      <entry>non-shell has no parent in XtMakeGeometryRequest</entry>
+    </row>
+    <row>
+      <entry>invalidParent</entry>
+      <entry>xtMakeGeometryRequest</entry>
+      <entry>XtMakeGeometryRequest - parent not composite</entry>
+    </row>
+    <row>
+      <entry>invalidParent</entry>
+      <entry>xtManageChildren</entry>
+      <entry>Attempt to manage a child when parent is not Composite</entry>
+    </row>
+    <row>
+      <entry>invalidParent</entry>
+      <entry>xtUnmanageChildren</entry>
+      <entry>Attempt to unmanage a child when parent is not Composite</entry>
+    </row>
+    <row>
+      <entry>invalidProcedure</entry>
+      <entry>inheritanceProc</entry>
+      <entry>Unresolved inheritance operation</entry>
+    </row>
+    <row>
+      <entry>invalidProcedure</entry>
+      <entry>realizeProc</entry>
+      <entry>No realize class procedure defined</entry>
+    </row>
+    <row>
+      <entry>invalidWindow</entry>
+      <entry>eventHandler</entry>
+      <entry>Event with wrong window</entry>
+    </row>
+    <row>
+      <entry>missingWidget</entry>
+      <entry>fetchDisplayArg</entry>
+      <entry>FetchDisplayArg called without a widget to reference</entry>
+    </row>
+    <row>
+      <entry>nonWidget</entry>
+      <entry>xtCreateWidget</entry>
+      <entry>attempt to add non-widget child "%s" to parent "%s" which supports only widgets</entry>
+    </row>
+    <row>
+      <entry>noPerDisplay</entry>
+      <entry>closeDisplay</entry>
+      <entry>Couldn't find per display information</entry>
+    </row>
+    <row>
+      <entry>noPerDisplay</entry>
+      <entry>getPerDisplay</entry>
+      <entry>Couldn't find per display information</entry>
+    </row>
+    <row>
+      <entry>noSelectionProperties</entry>
+      <entry>freeSelectionProperty</entry>
+      <entry>internal error: no selection property context for display</entry>
+    </row>
+    <row>
+      <entry>noWidgetAncestor</entry>
+      <entry>windowedAncestor</entry>
+      <entry>Object "%s" does not have windowed ancestor</entry>
+    </row>
+    <row>
+      <entry>nullDisplay</entry>
+      <entry>xtRegisterExtensionSelector</entry>
+      <entry>XtRegisterExtensionSelector requires a non-NULL display</entry>
+    </row>
+    <row>
+      <entry>nullProc</entry>
+      <entry>insertChild</entry>
+      <entry>"%s" parent has NULL insert_child method</entry>
+    </row>
+    <row>
+      <entry>r2versionMismatch</entry>
+      <entry>widget</entry>
+      <entry>Widget class %s must be re-compiled.</entry>
+    </row>
+    <row>
+      <entry>R3versionMismatch</entry>
+      <entry>widget</entry>
+      <entry>Widget class %s must be re-compiled.</entry>
+    </row>
+    <row>
+      <entry>R4orR5versionMismatch</entry>
+      <entry>widget</entry>
+      <entry>Widget class %s must be re-compiled.</entry>
+    </row>
+    <row>
+      <entry>rangeError</entry>
+      <entry>xtRegisterExtensionSelector</entry>
+      <entry>Attempt to register multiple selectors for one extension event type</entry>
+    </row>
+    <row>
+      <entry>sessionManagement</entry>
+      <entry>SmcOpenConnection</entry>
+      <entry>Tried to connect to session manager, %s</entry>
+    </row>
+    <row>
+      <entry>subclassMismatch</entry>
+      <entry>xtCheckSubclass</entry>
+      <entry>Widget class %s found when subclass of %s expected: %s</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para><emphasis role='strong'>Warning Messages</emphasis></para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <colspec colwidth='1.0*' colname='c3'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Name</entry>
+      <entry>Type</entry>
+      <entry>Default Message</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>ambiguousParent</entry>
+      <entry>xtChangeManagedSet</entry>
+      <entry>Not all children have same parent</entry>
+    </row>
+    <row>
+      <entry>ambiguousParent</entry>
+      <entry>xtManageChildren</entry>
+      <entry>Not all children have same parent in XtManageChildren</entry>
+    </row>
+    <row>
+      <entry>ambiguousParent</entry>
+      <entry>xtUnmanageChildren</entry>
+      <entry>Not all children have same parent in XtUnmanageChildren</entry>
+    </row>
+    <row>
+      <entry>badFormat</entry>
+      <entry>xtGetSelectionValue</entry>
+      <entry>Selection owner returned type INCR property with format != 32</entry>
+    </row>
+    <row>
+      <entry>badGeometry</entry>
+      <entry>shellRealize</entry>
+      <entry>Shell widget "%s" has an invalid geometry specification: "%s"</entry>
+    </row>
+    <row>
+      <entry>badValue</entry>
+      <entry>cvtStringToPixel</entry>
+      <entry>Color name "%s" is not defined</entry>
+    </row>
+    <row>
+      <entry>communicationError</entry>
+      <entry>select</entry>
+      <entry>Select failed; error code %s</entry>
+    </row>
+    <row>
+      <entry>conversionError</entry>
+      <entry>string</entry>
+      <entry>Cannot convert string "%s" to type %s</entry>
+    </row>
+    <row>
+      <entry>conversionError</entry>
+      <entry>stringToVisual</entry>
+      <entry>Cannot find Visual of class %s for display %s</entry>
+    </row>
+    <row>
+      <entry>conversionFailed</entry>
+      <entry>xtConvertVarToArgList</entry>
+      <entry>Type conversion failed</entry>
+    </row>
+    <row>
+      <entry>conversionFailed</entry>
+      <entry>xtGetTypedArg</entry>
+      <entry>Type conversion (%s to %s) failed for widget '%s'</entry>
+    </row>
+    <row>
+      <entry>displayError</entry>
+      <entry>invalidDisplay</entry>
+      <entry>Can't find display structure</entry>
+    </row>
+    <row>
+      <entry>grabError</entry>
+      <entry>xtAddGrab</entry>
+      <entry>XtAddGrab requires exclusive grab if spring_loaded is TRUE</entry>
+    </row>
+    <row>
+      <entry>grabError</entry>
+      <entry>xtRemoveGrab</entry>
+      <entry>XtRemoveGrab asked to remove a widget not on the list</entry>
+    </row>
+    <row>
+      <entry>initializationError</entry>
+      <entry>xtInitialize</entry>
+      <entry>Initializing Resource Lists twice</entry>
+    </row>
+    <row>
+      <entry>insufficientSpace</entry>
+      <entry>xtGetTypedArg</entry>
+      <entry>Insufficient space for converted type '%s' in widget '%s'</entry>
+    </row>
+    <row>
+      <entry>internalError</entry>
+      <entry>shell</entry>
+      <entry>Shell's window manager interaction is broken</entry>
+    </row>
+    <row>
+      <entry>invalidAddressMode</entry>
+      <entry>computeArgs</entry>
+      <entry>Conversion arguments for widget '%s' contain an unsupported address mode</entry>
+    </row>
+    <row>
+      <entry>invalidArgCount</entry>
+      <entry>getResources</entry>
+      <entry>argument count &gt; 0 on NULL argument list</entry>
+    </row>
+    <row>
+      <entry>invalidCallbackList</entry>
+      <entry>xtAddCallback</entry>
+      <entry>Cannot find callback list in XtAddCallback</entry>
+    </row>
+    <row>
+      <entry>invalidCallbackList</entry>
+      <entry>xtAddCallback</entry>
+      <entry>Cannot find callback list in XtAddCallbacks</entry>
+    </row>
+    <row>
+      <entry>invalidCallbackList</entry>
+      <entry>xtCallCallback</entry>
+      <entry>Cannot find callback list in XtCallCallbacks</entry>
+    </row>
+    <row>
+      <entry>invalidCallbackList</entry>
+      <entry>xtRemoveAllCallback</entry>
+      <entry>Cannot find callback list in XtRemoveAllCallbacks</entry>
+    </row>
+    <row>
+      <entry>invalidCallbackList</entry>
+      <entry>xtRemoveCallback</entry>
+      <entry>Cannot find callback list in XtRemoveCallbacks</entry>
+    </row>
+    <row>
+      <entry>invalidChild</entry>
+      <entry>xtChangeManagedSet</entry>
+      <entry>Null child passed to UnmanageChildren</entry>
+    </row>
+    <row>
+      <entry>invalidChild</entry>
+      <entry>xtManageChildren</entry>
+      <entry>null child passed to ManageChildren</entry>
+    </row>
+    <row>
+      <entry>invalidChild</entry>
+      <entry>xtManageChildren</entry>
+      <entry>null child passed to XtManageChildren</entry>
+    </row>
+    <row>
+      <entry>invalidChild</entry>
+      <entry>xtUnmanageChildren</entry>
+      <entry>Null child passed to XtUnmanageChildren</entry>
+    </row>
+    <row>
+      <entry>invalidChild</entry>
+      <entry>xtUnmanageChildren</entry>
+      <entry>Null child found in argument list to unmanage</entry>
+    </row>
+    <row>
+      <entry>invalidDepth</entry>
+      <entry>setValues</entry>
+      <entry>Can't change widget depth</entry>
+    </row>
+    <row>
+      <entry>invalidExtension</entry>
+      <entry>xtCreateWidget</entry>
+      <entry>widget "%s" class %s has invalid CompositeClassExtension record</entry>
+    </row>
+    <row>
+      <entry>invalidExtension</entry>
+      <entry>xtCreateWidget</entry>
+      <entry>widget class %s has invalid ConstraintClassExtension record</entry>
+    </row>
+    <row>
+      <entry>invalidGrab</entry>
+      <entry>ungrabKeyOrButton</entry>
+      <entry>Attempt to remove nonexistent passive grab</entry>
+    </row>
+    <row>
+      <entry>invalidGrabKind</entry>
+      <entry>xtPopup</entry>
+      <entry>grab kind argument has invalid value; XtGrabNone assumed</entry>
+    </row>
+    <row>
+      <entry>invalidParameters</entry>
+      <entry>freeTranslations</entry>
+      <entry>Freeing XtTranslations requires no extra arguments</entry>
+    </row>
+    <row>
+      <entry>invalidParameters</entry>
+      <entry>mergeTranslations</entry>
+      <entry>MergeTM to TranslationTable needs no extra arguments</entry>
+    </row>
+    <row>
+      <entry>invalidParameters</entry>
+      <entry>xtMenuPopdown</entry>
+      <entry>XtMenuPopdown called with num_params != 0 or 1</entry>
+    </row>
+    <row>
+      <entry>invalidParameters</entry>
+      <entry>xtMenuPopupAction</entry>
+      <entry>MenuPopup wants exactly one argument</entry>
+    </row>
+    <row>
+      <entry>invalidParent</entry>
+      <entry>xtCopyFromParent</entry>
+      <entry>CopyFromParent must have non-NULL parent</entry>
+    </row>
+    <row>
+      <entry>invalidPopup</entry>
+      <entry>xtMenuPopup</entry>
+      <entry>Can't find popup widget "%s" in XtMenuPopup</entry>
+    </row>
+    <row>
+      <entry>invalidPopup</entry>
+      <entry>xtMenuPopdown</entry>
+      <entry>Can't find popup in widget "%s" in XtMenuPopdown</entry>
+    </row>
+    <row>
+      <entry>invalidPopup</entry>
+      <entry>unsupportedOperation</entry>
+      <entry>Pop-up menu creation is only supported on ButtonPress, KeyPress or EnterNotify events.</entry>
+    </row>
+    <row>
+      <entry>invalidPopup</entry>
+      <entry>unsupportedOperation</entry>
+      <entry>Pop-up menu creation is only supported on Button, Key or EnterNotify events.</entry>
+    </row>
+    <row>
+      <entry>invalidProcedure</entry>
+      <entry>deleteChild</entry>
+      <entry>null delete_child procedure for class %s in XtDestroy</entry>
+    </row>
+    <row>
+      <entry>invalidProcedure</entry>
+      <entry>inputHandler</entry>
+      <entry>XtRemoveInput: Input handler not found</entry>
+    </row>
+    <row>
+      <entry>invalidProcedure</entry>
+      <entry>set_values_almost</entry>
+      <entry>set_values_almost procedure shouldn't be NULL</entry>
+    </row>
+    <row>
+      <entry>invalidResourceCount</entry>
+      <entry>getResources</entry>
+      <entry>resource count &gt; 0 on NULL resource list</entry>
+    </row>
+    <row>
+      <entry>invalidResourceName</entry>
+      <entry>computeArgs</entry>
+      <entry>Cannot find resource name %s as argument to conversion</entry>
+    </row>
+    <row>
+      <entry>invalidShell</entry>
+      <entry>xtTranslateCoords</entry>
+      <entry>Widget has no shell ancestor</entry>
+    </row>
+    <row>
+      <entry>invalidSizeOverride</entry>
+      <entry>xtDependencies</entry>
+      <entry>Representation size %d must match superclass's to override %s</entry>
+    </row>
+    <row>
+      <entry>missingCharsetList</entry>
+      <entry>cvtStringToFontSet</entry>
+      <entry>Missing charsets in String to FontSet conversion</entry>
+    </row>
+    <row>
+      <entry>noActionProc</entry>
+      <entry>xtCallActionProc</entry>
+      <entry>No action proc named "%s" is registered for widget "%s"</entry>
+    </row>
+    <row>
+      <entry>noColormap</entry>
+      <entry>cvtStringToPixel</entry>
+      <entry>Cannot allocate colormap entry for "%s"</entry>
+    </row>
+    <row>
+      <entry>noFont</entry>
+      <entry>cvtStringToFont</entry>
+      <entry>Unable to load any usable ISO8859-1 font</entry>
+    </row>
+    <row>
+      <entry>noFont</entry>
+      <entry>cvtStringToFontSet</entry>
+      <entry>Unable to load any usable fontset</entry>
+    </row>
+    <row>
+      <entry>noFont</entry>
+      <entry>cvtStringToFontStruct</entry>
+      <entry>Unable to load any usable ISO8859-1 font</entry>
+    </row>
+    <row>
+      <entry>notInConvertSelection</entry>
+      <entry>xtGetSelectionRequest</entry>
+      <entry>XtGetSelectionRequest or XtGetSelectionParameters called for widget "%s" outside of ConvertSelection proc</entry>
+    </row>
+    <row>
+      <entry>notRectObj</entry>
+      <entry>xtChangeManagedSet</entry>
+      <entry>child "%s", class %s is not a RectObj</entry>
+    </row>
+    <row>
+      <entry>notRectObj</entry>
+      <entry>xtManageChildren</entry>
+      <entry>child "%s", class %s is not a RectObj</entry>
+    </row>
+    <row>
+      <entry>nullWidget</entry>
+      <entry>xtConvertVarToArgList</entry>
+      <entry>XtVaTypedArg conversion needs non-NULL widget handle</entry>
+    </row>
+    <row>
+      <entry>r3versionMismatch</entry>
+      <entry>widget</entry>
+      <entry>Shell Widget class %s binary compiled for R3</entry>
+    </row>
+    <row>
+      <entry>translationError</entry>
+      <entry>nullTable</entry>
+      <entry>Can't remove accelerators from NULL table</entry>
+    </row>
+    <row>
+      <entry>translationError</entry>
+      <entry>nullTable</entry>
+      <entry>Tried to remove nonexistent accelerators</entry>
+    </row>
+    <row>
+      <entry>translationError</entry>
+      <entry>ambiguousActions</entry>
+      <entry>Overriding earlier translation manager actions.</entry>
+    </row>
+    <row>
+      <entry>translationError</entry>
+      <entry>newActions</entry>
+      <entry>New actions are:%s</entry>
+    </row>
+    <row>
+      <entry>translationError</entry>
+      <entry>nullTable</entry>
+      <entry>table to (un)merge must not be null</entry>
+    </row>
+    <row>
+      <entry>translationError</entry>
+      <entry>nullTable</entry>
+      <entry>Can't translate event through NULL table</entry>
+    </row>
+    <row>
+      <entry>translationError</entry>
+      <entry>oldActions</entry>
+      <entry>Previous entry was: %s %s</entry>
+    </row>
+    <row>
+      <entry>translationError</entry>
+      <entry>unboundActions</entry>
+      <entry>Actions not found: %s</entry>
+    </row>
+    <row>
+      <entry>translationError</entry>
+      <entry>xtTranslateInitialize</entry>
+      <entry>Initializing Translation manager twice.</entry>
+    </row>
+    <row>
+      <entry>translationParseError</entry>
+      <entry>missingComma</entry>
+      <entry> ... possibly due to missing ',' in event sequence.</entry>
+    </row>
+    <row>
+      <entry>translationParseError</entry>
+      <entry>nonLatin1</entry>
+      <entry> ... probably due to non-Latin1 character in quoted string</entry>
+    </row>
+    <row>
+      <entry>translationParseError</entry>
+      <entry>parseError</entry>
+      <entry>translation table syntax error: %s</entry>
+    </row>
+    <row>
+      <entry>translationParseError</entry>
+      <entry>parseString</entry>
+      <entry>Missing '"'.</entry>
+    </row>
+    <row>
+      <entry>translationParseError</entry>
+      <entry>showLine</entry>
+      <entry> ... found while parsing '%s'</entry>
+    </row>
+    <row>
+      <entry>typeConversionError</entry>
+      <entry>noConverter</entry>
+      <entry>No type converter registered for '%s' to '%s' conversion.</entry>
+    </row>
+    <row>
+      <entry>unknownType</entry>
+      <entry>xtConvertVarToArgList</entry>
+      <entry>Unable to find type of resource for conversion</entry>
+    </row>
+    <row>
+      <entry>unknownType</entry>
+      <entry>xtGetTypedArg</entry>
+      <entry>Unable to find type of resource for conversion</entry>
+    </row>
+    <row>
+      <entry>versionMismatch</entry>
+      <entry>widget</entry>
+      <entry>Widget class %s version mismatch (recompilation needed):\\n widget %d vs. intrinsics %d.</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtIntOrPixelToXColor</entry>
+      <entry>Pixel to color conversion needs screen and colormap arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtIntToBool</entry>
+      <entry>Integer to Bool conversion needs no extra arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtIntToBoolean</entry>
+      <entry>Integer to Boolean conversion needs no extra arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtIntToFloat</entry>
+      <entry>Integer to Float conversion needs no extra arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtIntToFont</entry>
+      <entry>Integer to Font conversion needs no extra arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtIntToPixel</entry>
+      <entry>Integer to Pixel conversion needs no extra arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtIntToPixmap</entry>
+      <entry>Integer to Pixmap conversion needs no extra arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtIntToShort</entry>
+      <entry>Integer to Short conversion needs no extra arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtIntToUnsignedChar</entry>
+      <entry>Integer to UnsignedChar conversion needs no extra arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtStringToAcceleratorTable</entry>
+      <entry>String to AcceleratorTable conversion needs no extra arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtStringToAtom</entry>
+      <entry>String to Atom conversion needs Display argument</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtStringToBool</entry>
+      <entry>String to Bool conversion needs no extra arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtStringToBoolean</entry>
+      <entry>String to Boolean conversion needs no extra arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtStringToCommandArgArray</entry>
+      <entry>String to CommandArgArray conversion needs no extra arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtStringToCursor</entry>
+      <entry>String to cursor conversion needs display argument</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtStringToDimension</entry>
+      <entry>String to Dimension conversion needs no extra arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtStringToDirectoryString</entry>
+      <entry>String to DirectoryString conversion needs no extra arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtStringToDisplay</entry>
+      <entry>String to Display conversion needs no extra arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtStringToFile</entry>
+      <entry>String to File conversion needs no extra arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtStringToFloat</entry>
+      <entry>String to Float conversion needs no extra arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtStringToFont</entry>
+      <entry>String to font conversion needs display argument</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtStringToFontSet</entry>
+      <entry>String to FontSet conversion needs display and locale arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtStringToFontStruct</entry>
+      <entry>String to font conversion needs display argument</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtStringToGravity</entry>
+      <entry>String to Gravity conversion needs no extra arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtStringToInitialState</entry>
+      <entry>String to InitialState conversion needs no extra arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtStringToInt</entry>
+      <entry>String to Integer conversion needs no extra arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtStringToPixel</entry>
+      <entry>String to pixel conversion needs screen and colormap arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtStringToRestartStyle</entry>
+      <entry>String to RestartStyle conversion needs no extra arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtStringToShort</entry>
+      <entry>String to Integer conversion needs no extra arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtStringToTranslationTable</entry>
+      <entry>String to TranslationTable conversion needs no extra arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtStringToUnsignedChar</entry>
+      <entry>String to Integer conversion needs no extra arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtStringToVisual</entry>
+      <entry>String to Visual conversion needs screen and depth arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>cvtXColorToPixel</entry>
+      <entry>Color to Pixel conversion needs no extra arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>freeCursor</entry>
+      <entry>Free Cursor requires display argument</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>freeDirectoryString</entry>
+      <entry>Free Directory String requires no extra arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>freeFile</entry>
+      <entry>Free File requires no extra arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>freeFont</entry>
+      <entry>Free Font needs display argument</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>freeFontSet</entry>
+      <entry>FreeFontSet needs display and locale arguments</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>freeFontStruct</entry>
+      <entry>Free FontStruct requires display argument</entry>
+    </row>
+    <row>
+      <entry>wrongParameters</entry>
+      <entry>freePixel</entry>
+      <entry>Freeing a pixel requires screen and colormap arguments</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+</appendix>
diff --git a/specs/appE.xml b/specs/appE.xml
new file mode 100644 (file)
index 0000000..574cf15
--- /dev/null
@@ -0,0 +1,1703 @@
+<appendix id='Defined_Strings'>
+<title>Defined Strings</title>
+
+<para>
+The <function>StringDefs.h</function>
+header file contains definitions for the following resource name,
+class, and representation type symbolic constants.
+</para>
+
+<para><emphasis role='strong'>Resource names:</emphasis></para>
+<informaltable frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Symbol</entry>
+      <entry>Definition</entry>
+    </row>
+  </thead>
+  <tbody>
+    <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>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para><emphasis role='strong'>Resource classes:</emphasis></para>
+<informaltable frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='2' align='left' rowsep='0' colsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Symbol</entry>
+      <entry>Definition</entry>
+    </row>
+  </thead>
+  <tbody>
+    <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>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para><emphasis role='strong'>Resource representation types:</emphasis></para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Symbol</entry>
+      <entry>Definition</entry>
+    </row>
+  </thead>
+  <tbody>
+    <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>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para><emphasis role='strong'>Boolean enumeration constants:</emphasis></para>
+<informaltable frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='2' align='left' rowsep='0' colsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Symbol</entry>
+      <entry>Definition</entry>
+    </row>
+  </thead>
+  <tbody>
+    <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>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para><emphasis role='strong'>Orientation enumeration constants:</emphasis></para>
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Symbol</entry>
+      <entry>Definition</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>XtEvertical</entry>
+      <entry>"vertical"</entry>
+    </row>
+    <row>
+      <entry>XtEhorizontal</entry>
+      <entry>"horizontal"</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para><emphasis role='strong'>Text edit enumeration constants:</emphasis></para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' rowsep='0' colsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Symbol</entry>
+      <entry>Definition</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>XtEtextRead</entry>
+      <entry>"read"</entry>
+    </row>
+    <row>
+      <entry>XtEtextAppend</entry>
+      <entry>"append"</entry>
+    </row>
+    <row>
+      <entry>XtEtextEdit</entry>
+      <entry>"edit"</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para><emphasis role='strong'>Color enumeration constants:</emphasis></para>
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' rowsep='0' colsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Symbol</entry>
+      <entry>Definition</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>XtExtdefaultbackground</entry>
+      <entry>"xtdefaultbackground"</entry>
+    </row>
+    <row>
+      <entry>XtExtdefaultforeground</entry>
+      <entry>"xtdefaultforeground"</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para><emphasis role='strong'>Font constant:</emphasis></para>
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Symbol</entry>
+      <entry>Definition</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>XtExtdefaultfont</entry>
+      <entry>"xtdefaultfont"</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para><emphasis role='strong'>Hooks for External Agents constants:</emphasis></para>
+<informaltable frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Symbol</entry>
+      <entry>Definition</entry>
+    </row>
+  </thead>
+  <tbody>
+    <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>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+The
+<function>Shell.h</function>
+header file contains definitions for the following resource name,
+class, and representation type symbolic constants.
+</para>
+
+<para><emphasis role='strong'>Resource names:</emphasis></para>
+<informaltable frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Symbol</entry>
+      <entry>Definition</entry>
+    </row>
+  </thead>
+  <tbody>
+    <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>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para><emphasis role='strong'>Resource classes:</emphasis></para>
+<informaltable frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Symbol</entry>
+      <entry>Definition</entry>
+    </row>
+  </thead>
+  <tbody>
+    <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>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para><emphasis role='strong'>Resource representation types:</emphasis></para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colwidth='1.0*' colname='c1'/>
+  <colspec colwidth='1.0*' colname='c2'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Symbol</entry>
+      <entry>Definition</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>XtRAtom</entry>
+      <entry>"Atom"</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+</appendix>
diff --git a/specs/appF.xml b/specs/appF.xml
new file mode 100644 (file)
index 0000000..49f054b
--- /dev/null
@@ -0,0 +1,103 @@
+<appendix id='Resource_Configuration_Management'>
+<title>Resource Configuration Management</title>
+<para>
+Setting and changing resources in X applications can be difficult for
+both the application programmer and the end user.  <emphasis role='strong'>Resource
+Configuration Management (RCM)</emphasis> 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>
+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>
+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>
+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>
+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>
+<orderedlist>
+  <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>
+</orderedlist>
+<para>
+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
+<xref linkend='XtSetValues' xrefstyle='select: title'/>.
+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>
+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>
+</appendix>
diff --git a/specs/intrinsics.xml b/specs/intrinsics.xml
new file mode 100644 (file)
index 0000000..4c41695
--- /dev/null
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN" "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"
+[ <!ENTITY % defs SYSTEM "defs.ent"> %defs;
+]>
+
+<book id="intrinsics" lang="en">
+
+<bookinfo>
+   <title>X Toolkit Intrinsics - C Language Interface</title>
+   <subtitle>X Window System</subtitle>
+   <releaseinfo>X Version 11, Release &fullrelvers;</releaseinfo>
+   <printhistory><para>First Revision - April, 1994</para></printhistory>
+   <authorgroup>
+      <author>
+         <firstname>Joel</firstname><surname>McCormack</surname>
+         <affiliation>
+           <orgname>Digital Equipment Corporation</orgname>
+           <orgdiv>Western Software Laboratory</orgdiv>
+         </affiliation>
+      </author>
+      <author>
+         <firstname>Paul</firstname><surname>Asente</surname>
+         <affiliation>
+           <orgname>Digital Equipment Corporation</orgname>
+           <orgdiv>Western Software Laboratory</orgdiv>
+         </affiliation>
+      </author>
+      <author>
+         <firstname>Ralph</firstname><othername>R.</othername>
+         <surname>Swick</surname>
+         <affiliation>
+           <orgname>Digital Equipment Corporation</orgname>
+           <orgdiv>External Research Group</orgdiv>
+         </affiliation>
+      </author>
+   </authorgroup>
+   <printhistory><para>version 6 edited by Donna Converse X Consortium, Inc.</para></printhistory>
+
+<legalnotice>
+<para>XWindow System is a trademark of X Consortium, Inc.</para>
+
+<para role="multiLicensing">
+Copyright Â© 1985, 1986, 1987, 1988, 1991, 1994 X Consortium
+</para>
+
+<para>
+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:
+</para>
+
+<para>
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+</para>
+
+<para> 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.
+</para>
+
+<para>
+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.
+</para>
+</legalnotice>
+
+<legalnotice>
+<para role="multiLicensing">
+Copyright Â© 1985, 1986, 1987, 1988, 1991, 1994
+Digital Equipment Corporation, Maynard, Massachusetts.
+</para>
+
+<para>
+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.
+</para>
+
+</legalnotice>
+</bookinfo>
+
+
+
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="acknowledgement.xml"/>
+
+
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="preface.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="CH01.xml"/>
+
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="CH02.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="CH03.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="CH04.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="CH05.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="CH06.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="CH07.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="CH08.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="CH09.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="CH10.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="CH11.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="CH12.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="CH13.xml"/>
+
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="appA.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="appB.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="appC.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="appD.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="appE.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="appF.xml"/>
+
+</book>
+
diff --git a/specs/preface.xml b/specs/preface.xml
new file mode 100644 (file)
index 0000000..c5ac3cd
--- /dev/null
@@ -0,0 +1,51 @@
+<preface id='About_This_Manual'>
+<title>About This Manual</title>
+
+<para>
+X Toolkit Intrinsics â€” C Language Interface is intended to be read by both application programmers
+who will use one or more of the many widget sets built with the Intrinsics and by widget
+programmers who will use the Intrinsics to build widgets for one of the widget sets. Not all the
+information in this manual, however, applies to both audiences. That is, because the application
+programmer is likely to use only a number of the Intrinsics functions in writing an application and
+because the widget programmer is likely to use many more, if not all, of the Intrinsics functions
+in building a widget, an attempt has been made to highlight those areas of information that are
+deemed to be of special interest for the application programmer. (It is assumed the widget programmer
+will have to be familiar with all the information.) Therefore, all entries in the table of
+contents that are printed in <emphasis role='strong'>bold</emphasis> indicate the information that
+should be of special interest to an application programmer.
+</para>
+<para>
+It is also assumed that, as application programmers become more familiar with the concepts discussed
+in this manual, they will find it more convenient to implement portions of their applications
+as special-purpose or custom widgets. It is possible, nonetheless, to use widgets without
+knowing how to build them.
+</para>
+
+<bridgehead><emphasis role='strong'>Conventions Used in this Manual</emphasis></bridgehead>
+<para>This document uses the following conventions:</para>
+<itemizedlist spacing='compact'>
+  <listitem>
+    <para>
+Global symbols are printed in <function>this special font</function>. These can be either
+function names, symbols defined in include files, data types, or structure names. Arguments to
+functions, procedures, or macros are printed in italics.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Each function is introduced by a general discussion that distinguishes it from other functions.
+The function declaration itself follows, and each argument is specifically explained.
+General discussion of the function, if any is required, follows the arguments.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+To eliminate any ambiguity between those arguments that you pass and those that a function
+returns to you, the explanations for all arguments that you pass start with the word
+specifies or, in the case of multiple arguments, the word specify. The explanations for all
+arguments that are returned to you start with the word <emphasis>returns</emphasis> or, in
+the case of multiple arguments, the word <emphasis>return</emphasis>.
+    </para>
+  </listitem>
+</itemizedlist>
+</preface>
diff --git a/src/ActionHook.c b/src/ActionHook.c
new file mode 100644 (file)
index 0000000..b03a116
--- /dev/null
@@ -0,0 +1,143 @@
+/*LINTLIBRARY*/
+
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+/*
+ * Contains XtAppAddActionHook, XtRemoveActionHook
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+
+
+/*ARGSUSED*/
+static void FreeActionHookList(
+    Widget widget,             /* unused (and invalid) */
+    XtPointer closure,         /* ActionHook* */
+    XtPointer call_data)       /* unused */
+{
+    ActionHook list = *(ActionHook*)closure;
+    while (list != NULL) {
+       ActionHook next = list->next;
+       XtFree( (XtPointer)list );
+       list = next;
+    }
+}
+
+
+XtActionHookId XtAppAddActionHook(
+    XtAppContext app,
+    XtActionHookProc proc,
+    XtPointer closure)
+{
+    ActionHook hook = XtNew(ActionHookRec);
+    LOCK_APP(app);
+    hook->next = app->action_hook_list;
+    hook->app = app;
+    hook->proc = proc;
+    hook->closure = closure;
+    if (app->action_hook_list == NULL) {
+       _XtAddCallback( &app->destroy_callbacks,
+                       FreeActionHookList,
+                       (XtPointer)&app->action_hook_list
+                     );
+    }
+    app->action_hook_list = hook;
+    UNLOCK_APP(app);
+    return (XtActionHookId)hook;
+}
+
+
+void XtRemoveActionHook(
+    XtActionHookId id)
+{
+    ActionHook *p, hook = (ActionHook)id;
+    XtAppContext app = hook->app;
+    LOCK_APP(app);
+    for (p = &app->action_hook_list; p != NULL && *p != hook; p = &(*p)->next);
+    if (p) {
+       *p = hook->next;
+       XtFree( (XtPointer)hook );
+       if (app->action_hook_list == NULL)
+           _XtRemoveCallback(&app->destroy_callbacks, FreeActionHookList,
+                             (XtPointer) &app->action_hook_list);
+    }
+#ifdef DEBUG
+    else {
+       XtAppWarningMsg(app, "badId", "xtRemoveActionHook", XtCXtToolkitError,
+                       "XtRemoveActionHook called with bad or old hook id",
+                       (String*)NULL, (Cardinal*)NULL);
+    }
+#endif /*DEBUG*/
+    UNLOCK_APP(app);
+}
diff --git a/src/Alloc.c b/src/Alloc.c
new file mode 100644 (file)
index 0000000..c523d81
--- /dev/null
@@ -0,0 +1,541 @@
+/***********************************************************
+Copyright (c) 1993, 2011, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+/*
+ * X Toolkit Memory Allocation Routines
+ *
+ * Uses Xlib memory management, which is spec'd to be re-entrant.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "InitialI.h"
+#undef _XBCOPYFUNC
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#define Xmalloc(size) malloc((size))
+#define Xrealloc(ptr, size) realloc((ptr), (size))
+#define Xcalloc(nelem, elsize) calloc((nelem), (elsize))
+#define Xfree(ptr) free(ptr)
+
+#ifdef _XNEEDBCOPYFUNC
+void _XtBcopy(
+    char *src, char *dst,
+    int length)
+{
+    if (src < dst) {
+       dst += length;
+       src += length;
+       while (length--)
+           *--dst = *--src;
+    } else {
+       while (length--)
+           *dst++ = *src++;
+    }
+}
+#endif
+
+void _XtAllocError(
+    String type)
+{
+    Cardinal num_params = 1;
+    if (type == NULL) type = "local memory allocation";
+    XtErrorMsg("allocError", type, XtCXtToolkitError,
+              "Cannot perform %s", &type, &num_params);
+}
+
+void _XtHeapInit(
+    Heap*      heap)
+{
+    heap->start = NULL;
+    heap->bytes_remaining = 0;
+}
+
+/* Version of asprintf() using XtMalloc
+ * Not currently available in XTTRACEMEMORY version, since that would
+ * require varargs macros everywhere, which are only standard in C99 & later.
+ */
+Cardinal XtAsprintf(
+    String *new_string,
+    _Xconst char * _X_RESTRICT_KYWD format,
+    ...)
+{
+    char buf[256];
+    Cardinal len;
+    va_list ap;
+
+    va_start(ap, format);
+    len = vsnprintf(buf, sizeof(buf), format, ap);
+    va_end(ap);
+
+    if (len < 0)
+       _XtAllocError("vsnprintf");
+
+    *new_string = XtMalloc(len + 1); /* snprintf doesn't count trailing '\0' */
+    if (len < sizeof(buf))
+    {
+       strncpy(*new_string, buf, len);
+       (*new_string)[len] = '\0';
+    }
+    else
+    {
+       va_start(ap, format);
+       if (vsnprintf(*new_string, len + 1, format, ap) < 0)
+           _XtAllocError("vsnprintf");
+       va_end(ap);
+    }
+    return len;
+}
+
+
+#ifndef XTTRACEMEMORY
+
+char *XtMalloc(
+    unsigned size)
+{
+    char *ptr;
+
+#if defined(MALLOC_0_RETURNS_NULL) && defined(XTMALLOC_BC)
+    /* preserve this (broken) behavior until everyone fixes their apps */
+    if (!size) size = 1;
+#endif
+    if ((ptr = Xmalloc(size)) == NULL)
+        _XtAllocError("malloc");
+
+    return(ptr);
+}
+
+char *XtRealloc(
+    char     *ptr,
+    unsigned size)
+{
+   if (ptr == NULL) {
+#ifdef MALLOC_0_RETURNS_NULL
+       if (!size) size = 1;
+#endif
+       return(XtMalloc(size));
+   } else if ((ptr = Xrealloc(ptr, size)) == NULL
+#ifdef MALLOC_0_RETURNS_NULL
+               && size
+#endif
+       )
+       _XtAllocError("realloc");
+
+   return(ptr);
+}
+
+char *XtCalloc(
+    unsigned num, unsigned size)
+{
+    char *ptr;
+
+#if defined(MALLOC_0_RETURNS_NULL) && defined(XTMALLOC_BC)
+    /* preserve this (broken) behavior until everyone fixes their apps */
+    if (!size) num = size = 1;
+#endif
+    if ((ptr = Xcalloc(num, size)) == NULL)
+       _XtAllocError("calloc");
+
+    return(ptr);
+}
+
+void XtFree(
+    char *ptr)
+{
+    if (ptr != NULL) Xfree(ptr);
+}
+
+char* __XtMalloc(
+    unsigned size)
+{
+#ifdef MALLOC_0_RETURNS_NULL
+    if (!size) size = 1;
+#endif
+    return XtMalloc (size);
+}
+
+char* __XtCalloc(
+    unsigned num, unsigned size)
+{
+#ifdef MALLOC_0_RETURNS_NULL
+    if (!size) num = size = 1;
+#endif
+    return XtCalloc(num, size);
+}
+
+#ifndef HEAP_SEGMENT_SIZE
+#define HEAP_SEGMENT_SIZE 1492
+#endif
+
+char* _XtHeapAlloc(
+    Heap*      heap,
+    Cardinal   bytes)
+{
+    register char* heap_loc;
+    if (heap == NULL) return XtMalloc(bytes);
+    if (heap->bytes_remaining < (int)bytes) {
+       if ((bytes + sizeof(char*)) >= (HEAP_SEGMENT_SIZE>>1)) {
+           /* preserve current segment; insert this one in front */
+#ifdef _TRACE_HEAP
+           printf( "allocating large segment (%d bytes) on heap %#x\n",
+                   bytes, heap );
+#endif
+           heap_loc = XtMalloc(bytes + sizeof(char*));
+           if (heap->start) {
+               *(char**)heap_loc = *(char**)heap->start;
+               *(char**)heap->start = heap_loc;
+           }
+           else {
+               *(char**)heap_loc = NULL;
+               heap->start = heap_loc;
+           }
+           return heap_loc + sizeof(char*);
+       }
+       /* else discard remainder of this segment */
+#ifdef _TRACE_HEAP
+       printf( "allocating new segment on heap %#x\n", heap );
+#endif
+       heap_loc = XtMalloc((unsigned)HEAP_SEGMENT_SIZE);
+       *(char**)heap_loc = heap->start;
+       heap->start = heap_loc;
+       heap->current = heap_loc + sizeof(char*);
+       heap->bytes_remaining = HEAP_SEGMENT_SIZE - sizeof(char*);
+    }
+    bytes = (bytes + (sizeof(long) - 1)) & (~(sizeof(long) - 1));
+    heap_loc = heap->current;
+    heap->current += bytes;
+    heap->bytes_remaining -= bytes; /* can be negative, if rounded */
+    return heap_loc;
+}
+
+void _XtHeapFree(
+    Heap*      heap)
+{
+    char* segment = heap->start;
+    while (segment != NULL) {
+       char* next_segment = *(char**)segment;
+       XtFree(segment);
+       segment = next_segment;
+    }
+    heap->start = NULL;
+    heap->bytes_remaining = 0;
+}
+
+#else
+
+/*
+ * X Toolkit Memory Trace Allocation Routines
+ */
+
+#undef XtMalloc
+#undef XtRealloc
+#undef XtCalloc
+#undef XtFree
+
+typedef struct _Stats *StatsPtr;
+typedef struct _Stats {
+    StatsPtr prev, next;
+    char *file;
+    int line;
+    unsigned size;
+    unsigned long seq;
+    XtPointer heap;
+} Stats;
+
+static StatsPtr XtMemory = (StatsPtr)NULL;
+static unsigned long ActiveXtMemory = 0;
+static unsigned long XtSeqId = 0;
+static unsigned long XtSeqBreakpoint = ~0;
+
+#define StatsSize(n) ((((n) + (sizeof(long) - 1)) & ~(sizeof(long) - 1)) + sizeof(Stats))
+#define ToStats(ptr) ((StatsPtr)(ptr - sizeof(Stats)))
+#define ToMem(ptr) (((char *)ptr) + sizeof(Stats))
+
+#define CHAIN(ptr,len,hp) \
+    ptr->next = XtMemory; \
+    if (XtMemory) \
+        XtMemory->prev = ptr; \
+    XtMemory = ptr; \
+    ptr->prev = (StatsPtr)NULL; \
+    ptr->file = file; \
+    ptr->line = line; \
+    ptr->size = len; \
+    ptr->heap = hp; \
+    if (file) \
+       ActiveXtMemory += len; \
+    ptr->seq = XtSeqId; \
+    if (XtSeqId == XtSeqBreakpoint) \
+       _XtBreakpoint(ptr); \
+    XtSeqId++
+
+/*ARGUSED*/
+static void _XtBreakpoint(
+    StatsPtr mem)
+{
+    mem->seq = XtSeqId; /* avoid being optimized out of existence */
+}
+
+char *_XtMalloc(
+    unsigned size,
+    char *file,
+    int line)
+{
+    StatsPtr ptr;
+    unsigned newsize;
+    char* retval = NULL;
+
+    LOCK_PROCESS;
+    newsize = StatsSize(size);
+    if ((ptr = (StatsPtr)Xmalloc(newsize)) == NULL)
+        _XtAllocError("malloc");
+    CHAIN(ptr, size, NULL);
+    retval = (ToMem(ptr));
+    UNLOCK_PROCESS;
+    return retval;
+}
+
+char *XtMalloc(
+    unsigned size)
+{
+    return _XtMalloc(size, (char *)NULL, 0);
+}
+
+char *_XtRealloc(
+    char     *ptr,
+    unsigned size,
+    char *file,
+    int line)
+{
+   char *newptr;
+
+   LOCK_PROCESS;
+   newptr = _XtMalloc(size, file, line);
+   if (ptr) {
+       unsigned copysize = ToStats(ptr)->size;
+       if (copysize > size) copysize = size;
+       memmove(newptr, ptr, copysize);
+       _XtFree(ptr);
+   }
+   UNLOCK_PROCESS;
+   return(newptr);
+}
+
+char *XtRealloc(
+    char     *ptr,
+    unsigned size)
+{
+    return _XtRealloc(ptr, size, (char *)NULL, 0);
+}
+
+char *_XtCalloc(
+    unsigned num, unsigned size,
+    char *file,
+    int line)
+{
+    StatsPtr ptr;
+    unsigned total, newsize;
+    char* retval = NULL;
+
+    LOCK_PROCESS;
+    total = num * size;
+    newsize = StatsSize(total);
+    if ((ptr = (StatsPtr)Xcalloc(newsize, 1)) == NULL)
+        _XtAllocError("calloc");
+    CHAIN(ptr, total, NULL);
+    retval = (ToMem(ptr));
+    UNLOCK_PROCESS;
+    return retval;
+}
+
+char *XtCalloc(
+    unsigned num, unsigned size)
+{
+    return _XtCalloc(num, size, (char *)NULL, 0);
+}
+
+Boolean _XtIsValidPointer(
+    char *ptr)
+{
+    register StatsPtr mem;
+    register StatsPtr stp = ToStats(ptr);
+
+    LOCK_PROCESS;
+    for (mem = XtMemory; mem; mem = mem->next) {
+       if (mem == stp) {
+           UNLOCK_PROCESS;
+           return True;
+       }
+    }
+    UNLOCK_PROCESS;
+    return False;
+}
+
+Boolean _XtValidateMemory = False;
+
+void _XtFree(
+    char *ptr)
+{
+   register StatsPtr stp;
+
+   LOCK_PROCESS;
+   if (ptr) {
+       if (_XtValidateMemory && !_XtIsValidPointer(ptr))
+          abort();
+       stp = ToStats(ptr);
+       if (stp->file)
+          ActiveXtMemory -= stp->size;
+       if (stp->prev)
+          stp->prev->next = stp->next;
+       else
+          XtMemory = stp->next;
+       if (stp->next)
+          stp->next->prev = stp->prev;
+       Xfree((char *)stp);
+   }
+   UNLOCK_PROCESS;
+}
+
+void XtFree(char *ptr)
+{
+   _XtFree(ptr);
+}
+
+char *_XtHeapMalloc(
+    Heap *heap,
+    Cardinal size,
+    char *file,
+    int line)
+{
+    StatsPtr ptr;
+    unsigned newsize;
+    XtPointer hp = (XtPointer) heap;
+    char* retval = NULL;
+
+    LOCK_PROCESS;
+    newsize = StatsSize(size);
+    if ((ptr = (StatsPtr)Xmalloc(newsize)) == NULL)
+        _XtAllocError("malloc");
+    CHAIN(ptr, size, hp);
+    retval = (ToMem(ptr));
+    UNLOCK_PROCESS;
+    return retval;
+}
+
+void _XtHeapFree(register XtPointer heap)
+{
+    register StatsPtr mem, next;
+
+    LOCK_PROCESS;
+    for (mem = XtMemory; mem; mem = next) {
+       next = mem->next;
+       if (mem->heap == heap) {
+           if (mem->file)
+               ActiveXtMemory -= mem->size;
+           if (mem->prev)
+               mem->prev->next = next;
+           else
+               XtMemory = next;
+           if (next)
+               next->prev = mem->prev;
+           Xfree((char *)mem);
+       }
+    }
+    UNLOCK_PROCESS;
+}
+
+#include <stdio.h>
+
+void _XtPrintMemory(char * filename)
+{
+    register StatsPtr mem;
+    FILE *f;
+
+    if (filename == NULL)
+       f = stderr;
+    else
+       f = fopen(filename, "w");
+    LOCK_PROCESS;
+    fprintf(f, "total size: %d\n", ActiveXtMemory);
+    for (mem = XtMemory; mem; mem = mem->next) {
+       if (mem->file)
+           fprintf(f, "size: %6d  seq: %5d  %12s(%4d)  %s\n",
+                   mem->size, mem->seq,
+                   mem->file, mem->line, mem->heap ? "heap" : "");
+    }
+    UNLOCK_PROCESS;
+    if (filename) fclose(f);
+}
+
+#endif  /* XTTRACEMEMORY */
diff --git a/src/ArgList.c b/src/ArgList.c
new file mode 100644 (file)
index 0000000..a88341c
--- /dev/null
@@ -0,0 +1,75 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include       "IntrinsicI.h"
+#include       <stdio.h>
+
+/*
+ * This routine merges two arglists. It does NOT check for duplicate entries.
+ */
+
+ArgList XtMergeArgLists(
+    ArgList args1,
+    Cardinal num_args1,
+    ArgList args2,
+    Cardinal num_args2)
+{
+    ArgList result, args;
+
+    result = (ArgList) __XtCalloc((unsigned) num_args1 + num_args2,
+                               (unsigned) sizeof(Arg));
+
+    for (args = result; num_args1 != 0; num_args1--)
+       *args++ = *args1++;
+    for (             ; num_args2 != 0; num_args2--)
+       *args++ = *args2++;
+
+    return result;
+}
diff --git a/src/Callback.c b/src/Callback.c
new file mode 100644 (file)
index 0000000..a1231ec
--- /dev/null
@@ -0,0 +1,700 @@
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+
+static String XtNinvalidCallbackList = "invalidCallbackList";
+static String XtNxtAddCallback = "xtAddCallback";
+static String XtNxtRemoveCallback = "xtRemoveCallback";
+static String XtNxtRemoveAllCallback = "xtRemoveAllCallback";
+static String XtNxtCallCallback = "xtCallCallback";
+
+/* However it doesn't contain a final NULL record */
+#define ToList(p) ((XtCallbackList) ((p)+1))
+
+static InternalCallbackList* FetchInternalList(
+    Widget     widget,
+    _Xconst char *name)
+{
+    XrmQuark quark;
+    int n;
+    CallbackTable offsets;
+    InternalCallbackList* retval = NULL;
+
+    quark = StringToQuark(name);
+    LOCK_PROCESS;
+    offsets = (CallbackTable)
+       widget->core.widget_class->core_class.callback_private;
+
+    for (n = (int)(long) *(offsets++); --n >= 0; offsets++)
+       if (quark == (*offsets)->xrm_name) {
+           retval = (InternalCallbackList *)
+               ((char *) widget - (*offsets)->xrm_offset - 1);
+           break;
+       }
+    UNLOCK_PROCESS;
+    return retval;
+}
+
+
+void _XtAddCallback(
+    InternalCallbackList*   callbacks,
+    XtCallbackProc         callback,
+    XtPointer              closure)
+{
+    register InternalCallbackList icl;
+    register XtCallbackList cl;
+    register int count;
+
+    icl = *callbacks;
+    count = icl ? icl->count : 0;
+
+    if (icl && icl->call_state) {
+       icl->call_state |= _XtCBFreeAfterCalling;
+       icl = (InternalCallbackList)
+           __XtMalloc(sizeof(InternalCallbackRec) +
+                    sizeof(XtCallbackRec) * (count + 1));
+       (void) memmove((char *)ToList(icl), (char *)ToList(*callbacks),
+                      sizeof(XtCallbackRec) * count);
+    } else {
+       icl = (InternalCallbackList)
+           XtRealloc((char *) icl, sizeof(InternalCallbackRec) +
+                     sizeof(XtCallbackRec) * (count + 1));
+    }
+    *callbacks = icl;
+    icl->count = count + 1;
+    icl->is_padded = 0;
+    icl->call_state = 0;
+    cl = ToList(icl) + count;
+    cl->callback = callback;
+    cl->closure = closure;
+} /* _XtAddCallback */
+
+void _XtAddCallbackOnce(
+    register InternalCallbackList*callbacks,
+    XtCallbackProc         callback,
+    XtPointer              closure)
+{
+    register XtCallbackList cl = ToList(*callbacks);
+    register int i;
+
+    for (i=(*callbacks)->count; --i >= 0; cl++)
+       if (cl->callback == callback && cl->closure == closure)
+           return;
+
+    _XtAddCallback(callbacks, callback, closure);
+} /* _XtAddCallbackOnce */
+
+void XtAddCallback(
+    Widget         widget,
+    _Xconst char*   name,
+    XtCallbackProc  callback,
+    XtPointer      closure
+    )
+{
+    InternalCallbackList *callbacks;
+    Widget hookobj;
+    XtAppContext app = XtWidgetToApplicationContext(widget);
+
+    LOCK_APP(app);
+    callbacks = FetchInternalList(widget, name);
+    if (!callbacks) {
+       XtAppWarningMsg(app,
+              XtNinvalidCallbackList,XtNxtAddCallback,XtCXtToolkitError,
+              "Cannot find callback list in XtAddCallback",
+             (String *)NULL, (Cardinal *)NULL);
+       UNLOCK_APP(app);
+       return;
+    }
+    _XtAddCallback(callbacks, callback, closure);
+    if (!_XtIsHookObject(widget)) {
+       hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));
+       if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+           XtChangeHookDataRec call_data;
+
+           call_data.type = XtHaddCallback;
+           call_data.widget = widget;
+           call_data.event_data = (XtPointer) name;
+           XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.changehook_callbacks,
+               (XtPointer)&call_data);
+       }
+    }
+    UNLOCK_APP(app);
+} /* XtAddCallback */
+
+/* ARGSUSED */
+static void AddCallbacks(
+    Widget                 widget,
+    InternalCallbackList   *callbacks,
+    XtCallbackList         newcallbacks)
+{
+    register InternalCallbackList icl;
+    register int i, j;
+    register XtCallbackList cl;
+
+    icl = *callbacks;
+    i = icl ? icl->count : 0;
+    for (j=0, cl = newcallbacks; cl->callback; cl++, j++);
+    if (icl && icl->call_state) {
+       icl->call_state |= _XtCBFreeAfterCalling;
+       icl = (InternalCallbackList) __XtMalloc(sizeof(InternalCallbackRec) +
+                                             sizeof(XtCallbackRec) * (i+j));
+       (void) memmove((char *)ToList(*callbacks), (char *)ToList(icl),
+                      sizeof(XtCallbackRec) * i);
+    } else {
+       icl = (InternalCallbackList) XtRealloc((char *) icl,
+                                              sizeof(InternalCallbackRec) +
+                                              sizeof(XtCallbackRec) * (i+j));
+    }
+    *callbacks = icl;
+    icl->count = i+j;
+    icl->is_padded = 0;
+    icl->call_state = 0;
+    for (cl = ToList(icl) + i; --j >= 0; )
+       *cl++ = *newcallbacks++;
+} /* AddCallbacks */
+
+void XtAddCallbacks(
+    Widget         widget,
+    _Xconst char*   name,
+    XtCallbackList  xtcallbacks
+    )
+{
+    InternalCallbackList* callbacks;
+    Widget hookobj;
+    XtAppContext app = XtWidgetToApplicationContext(widget);
+
+    LOCK_APP(app);
+    callbacks = FetchInternalList(widget, name);
+    if (!callbacks) {
+       XtAppWarningMsg(app,
+              XtNinvalidCallbackList,XtNxtAddCallback,XtCXtToolkitError,
+              "Cannot find callback list in XtAddCallbacks",
+             (String *)NULL, (Cardinal *)NULL);
+       UNLOCK_APP(app);
+       return;
+    }
+    AddCallbacks(widget, callbacks, xtcallbacks);
+    hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+       XtChangeHookDataRec call_data;
+
+       call_data.type = XtHaddCallbacks;
+       call_data.widget = widget;
+       call_data.event_data = (XtPointer) name;
+       XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.changehook_callbacks,
+               (XtPointer)&call_data);
+    }
+    UNLOCK_APP(app);
+} /* XtAddCallbacks */
+
+void _XtRemoveCallback (
+    InternalCallbackList   *callbacks,
+    XtCallbackProc         callback,
+    XtPointer              closure)
+{
+    register InternalCallbackList icl;
+    register int i, j;
+    register XtCallbackList cl, ncl, ocl;
+
+    icl = *callbacks;
+    if (!icl) return;
+
+    cl = ToList(icl);
+    for (i=icl->count; --i >= 0; cl++) {
+       if (cl->callback == callback && cl->closure == closure) {
+           if (icl->call_state) {
+               icl->call_state |= _XtCBFreeAfterCalling;
+               if (icl->count == 1) {
+                   *callbacks = NULL;
+               } else {
+                   j = icl->count - i - 1;
+                   ocl = ToList(icl);
+                   icl = (InternalCallbackList)
+                       __XtMalloc(sizeof(InternalCallbackRec) +
+                                sizeof(XtCallbackRec) * (i + j));
+                   icl->count = i + j;
+                   icl->is_padded = 0;
+                   icl->call_state = 0;
+                   ncl = ToList(icl);
+                   while (--j >= 0)
+                       *ncl++ = *ocl++;
+                   while (--i >= 0)
+                       *ncl++ = *++cl;
+                   *callbacks = icl;
+               }
+           } else {
+               if (--icl->count) {
+                   ncl = cl + 1;
+                   while (--i >= 0)
+                       *cl++ = *ncl++;
+                   icl = (InternalCallbackList)
+                       XtRealloc((char *) icl, sizeof(InternalCallbackRec)
+                                 + sizeof(XtCallbackRec) * icl->count);
+                   icl->is_padded = 0;
+                   *callbacks = icl;
+               } else {
+                   XtFree((char *) icl);
+                   *callbacks = NULL;
+               }
+           }
+           return;
+       }
+    }
+} /* _XtRemoveCallback */
+
+void XtRemoveCallback (
+    Widget         widget,
+    _Xconst char*   name,
+    XtCallbackProc  callback,
+    XtPointer      closure
+    )
+{
+    InternalCallbackList *callbacks;
+    Widget hookobj;
+    XtAppContext app = XtWidgetToApplicationContext(widget);
+
+    LOCK_APP(app);
+    callbacks = FetchInternalList(widget, name);
+    if (!callbacks) {
+       XtAppWarningMsg(app,
+              XtNinvalidCallbackList,XtNxtRemoveCallback,XtCXtToolkitError,
+              "Cannot find callback list in XtRemoveCallback",
+             (String *)NULL, (Cardinal *)NULL);
+       UNLOCK_APP(app);
+       return;
+    }
+    _XtRemoveCallback(callbacks, callback, closure);
+    hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+       XtChangeHookDataRec call_data;
+
+       call_data.type = XtHremoveCallback;
+       call_data.widget = widget;
+       call_data.event_data = (XtPointer) name;
+       XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.changehook_callbacks,
+               (XtPointer)&call_data);
+    }
+    UNLOCK_APP(app);
+} /* XtRemoveCallback */
+
+
+void XtRemoveCallbacks (
+    Widget         widget,
+    _Xconst char*   name,
+    XtCallbackList  xtcallbacks)
+{
+    InternalCallbackList *callbacks;
+    Widget hookobj;
+    int i;
+    InternalCallbackList icl;
+    XtCallbackList cl, ccl, rcl;
+    XtAppContext app = XtWidgetToApplicationContext(widget);
+
+    LOCK_APP(app);
+    callbacks = FetchInternalList(widget, name);
+    if (!callbacks) {
+       XtAppWarningMsg(app,
+              XtNinvalidCallbackList,XtNxtRemoveCallback,XtCXtToolkitError,
+              "Cannot find callback list in XtRemoveCallbacks",
+             (String *)NULL, (Cardinal *)NULL);
+       UNLOCK_APP(app);
+       return;
+    }
+
+    icl = *callbacks;
+    if (!icl) {
+       UNLOCK_APP(app);
+       return;
+    }
+
+    i = icl->count;
+    cl = ToList(icl);
+    if (icl->call_state) {
+       icl->call_state |= _XtCBFreeAfterCalling;
+       icl = (InternalCallbackList)__XtMalloc(sizeof(InternalCallbackRec) +
+                                            sizeof(XtCallbackRec) * i);
+       icl->count = i;
+       icl->call_state = 0;
+    }
+    ccl = ToList(icl);
+    while (--i >= 0) {
+       *ccl++ = *cl;
+       for (rcl=xtcallbacks; rcl->callback; rcl++) {
+           if (cl->callback == rcl->callback && cl->closure == rcl->closure) {
+               ccl--;
+               icl->count--;
+               break;
+           }
+       }
+       cl++;
+    }
+    if (icl->count) {
+       icl = (InternalCallbackList)
+           XtRealloc((char *)icl, (sizeof(InternalCallbackRec) +
+                                   sizeof(XtCallbackRec) * icl->count));
+       icl->is_padded = 0;
+       *callbacks = icl;
+    } else {
+       XtFree((char *)icl);
+       *callbacks = NULL;
+    }
+    hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+       XtChangeHookDataRec call_data;
+
+       call_data.type = XtHremoveCallbacks;
+       call_data.widget = widget;
+       call_data.event_data = (XtPointer) name;
+       XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.changehook_callbacks,
+               (XtPointer)&call_data);
+    }
+    UNLOCK_APP(app);
+} /* XtRemoveCallbacks */
+
+
+void _XtRemoveAllCallbacks (
+    InternalCallbackList *callbacks)
+{
+    register InternalCallbackList icl = *callbacks;
+
+    if (icl) {
+       if (icl->call_state)
+           icl->call_state |= _XtCBFreeAfterCalling;
+       else
+           XtFree((char *) icl);
+       *callbacks = NULL;
+    }
+} /* _XtRemoveAllCallbacks */
+
+void XtRemoveAllCallbacks(
+    Widget widget,
+    _Xconst char* name)
+{
+    InternalCallbackList *callbacks;
+    Widget hookobj;
+    XtAppContext app = XtWidgetToApplicationContext(widget);
+
+    LOCK_APP(app);
+    callbacks = FetchInternalList(widget, name);
+    if (!callbacks) {
+       XtAppWarningMsg(app,
+              XtNinvalidCallbackList,XtNxtRemoveAllCallback,XtCXtToolkitError,
+              "Cannot find callback list in XtRemoveAllCallbacks",
+             (String *)NULL, (Cardinal *)NULL);
+       UNLOCK_APP(app);
+       return;
+    }
+    _XtRemoveAllCallbacks(callbacks);
+    hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+       XtChangeHookDataRec call_data;
+
+       call_data.type = XtHremoveAllCallbacks;
+       call_data.widget = widget;
+       call_data.event_data = (XtPointer) name;
+       XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.changehook_callbacks,
+               (XtPointer)&call_data);
+    }
+    UNLOCK_APP(app);
+} /* XtRemoveAllCallbacks */
+
+InternalCallbackList _XtCompileCallbackList(
+    XtCallbackList xtcallbacks)
+{
+    register int n;
+    register XtCallbackList xtcl, cl;
+    register InternalCallbackList callbacks;
+
+    for (n=0, xtcl=xtcallbacks; xtcl->callback; n++, xtcl++) {};
+    if (n == 0) return (InternalCallbackList) NULL;
+
+    callbacks = (InternalCallbackList) __XtMalloc(sizeof(InternalCallbackRec) +
+                                               sizeof(XtCallbackRec) * n);
+    callbacks->count = n;
+    callbacks->is_padded = 0;
+    callbacks->call_state = 0;
+    cl = ToList(callbacks);
+    while (--n >= 0)
+       *cl++ = *xtcallbacks++;
+    return(callbacks);
+} /* _XtCompileCallbackList */
+
+
+XtCallbackList _XtGetCallbackList(
+    InternalCallbackList *callbacks)
+{
+    register int i;
+    register InternalCallbackList icl;
+    register XtCallbackList cl, ocl;
+
+    icl = *callbacks;
+    if (!icl) {
+       static XtCallbackRec emptyList[1] = { {NULL, NULL} };
+       return (XtCallbackList)emptyList;
+    }
+    if (icl->is_padded)
+       return ToList(icl);
+    i = icl->count;
+    if (icl->call_state) {
+       icl->call_state |= _XtCBFreeAfterCalling;
+       ocl = ToList(icl);
+       icl = (InternalCallbackList) __XtMalloc(sizeof(InternalCallbackRec) +
+                                             sizeof(XtCallbackRec) * (i+1));
+       icl->count = i;
+       icl->call_state = 0;
+       cl = ToList(icl);
+       while (--i >= 0)
+           *cl++ = *ocl++;
+    } else {
+       icl = (InternalCallbackList) XtRealloc((char *)icl,
+                                              sizeof(InternalCallbackRec) +
+                                              sizeof(XtCallbackRec) * (i+1));
+       cl = ToList(icl) + i;
+    }
+    icl->is_padded = 1;
+    cl->callback = (XtCallbackProc) NULL;
+    cl->closure = NULL;
+    *callbacks = icl;
+    return ToList(icl);
+}
+
+void XtCallCallbacks(
+    Widget   widget,
+    _Xconst char* name,
+    XtPointer call_data
+    )
+{
+    InternalCallbackList *callbacks;
+    InternalCallbackList icl;
+    XtCallbackList cl;
+    int i;
+    char ostate;
+    XtAppContext app = XtWidgetToApplicationContext(widget);
+
+    LOCK_APP(app);
+    callbacks = FetchInternalList(widget, name);
+    if (!callbacks) {
+       XtAppWarningMsg(app,
+              XtNinvalidCallbackList,XtNxtCallCallback,XtCXtToolkitError,
+              "Cannot find callback list in XtCallCallbacks",
+             (String *)NULL, (Cardinal *)NULL);
+       UNLOCK_APP(app);
+       return;
+    }
+
+    icl = *callbacks;
+    if (!icl) {
+       UNLOCK_APP(app);
+       return;
+    }
+    cl = ToList(icl);
+    if (icl->count == 1) {
+       (*cl->callback) (widget, cl->closure, call_data);
+       UNLOCK_APP(app);
+       return;
+    }
+    ostate = icl->call_state;
+    icl->call_state = _XtCBCalling;
+    for (i = icl->count; --i >= 0; cl++)
+       (*cl->callback) (widget, cl->closure, call_data);
+    if (ostate)
+       icl->call_state |= ostate;
+    else if (icl->call_state & _XtCBFreeAfterCalling)
+       XtFree((char *)icl);
+    else
+       icl->call_state = ostate;
+    UNLOCK_APP(app);
+} /* XtCallCallbacks */
+
+
+XtCallbackStatus XtHasCallbacks(
+     Widget            widget,
+     _Xconst char*     callback_name
+     )
+{
+    InternalCallbackList *callbacks;
+    XtCallbackStatus retval = XtCallbackHasSome;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    callbacks = FetchInternalList(widget, callback_name);
+    if (!callbacks)
+       retval = XtCallbackNoList;
+    else if (!*callbacks)
+       retval = XtCallbackHasNone;
+    UNLOCK_APP(app);
+    return retval;
+} /* XtHasCallbacks */
+
+
+void XtCallCallbackList(
+    Widget widget,
+    XtCallbackList callbacks,
+    XtPointer call_data)
+{
+    register InternalCallbackList icl;
+    register XtCallbackList cl;
+    register int i;
+    char ostate;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    if (!callbacks) {
+       UNLOCK_APP(app);
+       return;
+    }
+    icl = (InternalCallbackList)callbacks;
+    cl = ToList(icl);
+    if (icl->count == 1) {
+       (*cl->callback) (widget, cl->closure, call_data);
+       UNLOCK_APP(app);
+       return;
+    }
+    ostate = icl->call_state;
+    icl->call_state = _XtCBCalling;
+    for (i = icl->count; --i >= 0; cl++)
+       (*cl->callback) (widget, cl->closure, call_data);
+    if (ostate)
+       icl->call_state |= ostate;
+    else if (icl->call_state & _XtCBFreeAfterCalling)
+       XtFree((char *)icl);
+    else
+       icl->call_state = 0;
+    UNLOCK_APP(app);
+} /* XtCallCallbackList */
+
+void _XtPeekCallback(
+    Widget widget,
+    XtCallbackList callbacks,
+    XtCallbackProc *callback,
+    XtPointer *closure)
+{
+    register InternalCallbackList icl = (InternalCallbackList) callbacks;
+    register XtCallbackList cl;
+
+    if (!callbacks) {
+       *callback = (XtCallbackProc) NULL;
+       return;
+    }
+    cl = ToList(icl);
+    *callback = cl->callback;
+    *closure = cl->closure;
+    return;
+}
+
+void _XtCallConditionalCallbackList(
+    Widget widget,
+    XtCallbackList callbacks,
+    XtPointer call_data,
+    _XtConditionProc cond_proc)
+{
+    register InternalCallbackList icl;
+    register XtCallbackList cl;
+    register int i;
+    char ostate;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    if (!callbacks) {
+       UNLOCK_APP(app);
+       return;
+    }
+    icl = (InternalCallbackList)callbacks;
+    cl = ToList(icl);
+    if (icl->count == 1) {
+       (*cl->callback) (widget, cl->closure, call_data);
+       (void) (*cond_proc)(call_data);
+       UNLOCK_APP(app);
+       return;
+    }
+    ostate = icl->call_state;
+    icl->call_state = _XtCBCalling;
+    for (i = icl->count; --i >= 0; cl++) {
+       (*cl->callback) (widget, cl->closure, call_data);
+       if (! (*cond_proc)(call_data))
+           break;
+    }
+    if (ostate)
+       icl->call_state |= ostate;
+    else if (icl->call_state & _XtCBFreeAfterCalling)
+       XtFree((char *)icl);
+    else
+       icl->call_state = 0;
+    UNLOCK_APP(app);
+}
diff --git a/src/ClickTime.c b/src/ClickTime.c
new file mode 100644 (file)
index 0000000..7a836cc
--- /dev/null
@@ -0,0 +1,102 @@
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+/*
+ * Contains XtSetMultiClickTime, XtGetMultiClickTime
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+
+void XtSetMultiClickTime(
+    Display *dpy,
+    int time)
+{
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    _XtGetPerDisplay(dpy)->multi_click_time = time;
+    UNLOCK_APP(app);
+}
+
+
+int XtGetMultiClickTime(
+    Display *dpy)
+{
+    int retval;
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    retval = _XtGetPerDisplay(dpy)->multi_click_time;
+    UNLOCK_APP(app);
+    return retval;
+}
diff --git a/src/Composite.c b/src/Composite.c
new file mode 100644 (file)
index 0000000..29893d8
--- /dev/null
@@ -0,0 +1,291 @@
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+
+static XtResource resources[] = {
+    {XtNchildren, XtCReadOnly, XtRWidgetList, sizeof(WidgetList),
+     XtOffsetOf(CompositeRec, composite.children), XtRImmediate, NULL},
+    {XtNnumChildren, XtCReadOnly, XtRCardinal, sizeof(Cardinal),
+     XtOffsetOf(CompositeRec, composite.num_children), XtRImmediate, NULL},
+    {XtNinsertPosition, XtCInsertPosition, XtRFunction, sizeof(XtOrderProc),
+     XtOffsetOf(CompositeRec, composite.insert_position), XtRImmediate, NULL},
+};
+
+static void CompositeClassPartInitialize(WidgetClass);
+static void CompositeInitialize(Widget, Widget, ArgList, Cardinal *);
+static void CompositeInsertChild(Widget);
+static void CompositeDeleteChild(Widget);
+static void CompositeDestroy(Widget);
+
+externaldef(compositeclassrec) CompositeClassRec compositeClassRec = {
+  { /******* CorePart *******/
+    /* superclass          */  &widgetClassRec,
+    /* class_name          */  "Composite",
+    /* widget_size         */  sizeof(CompositeRec),
+    /* class_initialize     */  NULL,
+    /* class_part_initialize*/ CompositeClassPartInitialize,
+    /* class_inited        */  FALSE,
+    /* initialize          */  CompositeInitialize,
+    /* initialize_hook      */ NULL,
+    /* realize             */  XtInheritRealize,
+    /* actions             */  NULL,
+    /* num_actions         */  0,
+    /* resources           */  resources,
+    /* num_resources       */  XtNumber(resources),
+    /* xrm_class           */  NULLQUARK,
+    /* compress_motion      */ FALSE,
+    /* compress_exposure    */ TRUE,
+    /* compress_enterleave  */  FALSE,
+    /* visible_interest     */ FALSE,
+    /* destroy             */  CompositeDestroy,
+    /* resize              */  NULL,
+    /* expose              */  NULL,
+    /* set_values          */  NULL,
+    /* 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      */  NULL,
+    /* display_accelerator  */ NULL,
+    /* extension           */  NULL
+  },
+  { /**** CompositePart *****/
+    /* geometry_handler     */  NULL,
+    /* change_managed       */  NULL,
+    /* insert_child        */  CompositeInsertChild,
+    /* delete_child        */  CompositeDeleteChild,
+    /* extension           */  NULL
+    }
+};
+
+externaldef(compositewidgetclass) WidgetClass compositeWidgetClass = (WidgetClass) &compositeClassRec;
+
+static void InheritAllowsChangeManagedSet(
+    WidgetClass widget_class)
+{
+    CompositeWidgetClass cc = (CompositeWidgetClass) widget_class;
+    CompositeClassExtension ext, super_ext, new_ext;
+
+    ext = (CompositeClassExtension)
+       XtGetClassExtension(widget_class,
+                   XtOffsetOf(CompositeClassRec, composite_class.extension),
+                           NULLQUARK, 1L, 0);
+
+    if (ext && ext->version == XtCompositeExtensionVersion)
+       return;
+
+    super_ext = (CompositeClassExtension)
+       XtGetClassExtension(cc->core_class.superclass,
+                   XtOffsetOf(CompositeClassRec, composite_class.extension),
+                           NULLQUARK, 1L, 0);
+
+    LOCK_PROCESS;
+    if (super_ext && super_ext->version == XtCompositeExtensionVersion &&
+       super_ext->record_size == sizeof(CompositeClassExtensionRec) &&
+       super_ext->allows_change_managed_set) {
+
+       new_ext = (CompositeClassExtension)
+           __XtCalloc(1, sizeof(CompositeClassExtensionRec));
+
+       /* Be careful to inherit only what is appropriate */
+       new_ext->next_extension = cc->composite_class.extension;
+       new_ext->record_type = NULLQUARK;
+       new_ext->version = XtCompositeExtensionVersion;
+       new_ext->record_size = sizeof(CompositeClassExtensionRec);
+       new_ext->accepts_objects = (ext ? ext->accepts_objects : False);
+       new_ext->allows_change_managed_set = True;
+       cc->composite_class.extension = (XtPointer) new_ext;
+    }
+    UNLOCK_PROCESS;
+}
+
+static void CompositeClassPartInitialize(
+       WidgetClass widgetClass)
+{
+    register CompositePartPtr wcPtr;
+    register CompositePartPtr superPtr = NULL;
+
+    wcPtr = (CompositePartPtr)
+       &(((CompositeWidgetClass)widgetClass)->composite_class);
+
+    if (widgetClass != compositeWidgetClass)
+       /* don't compute possible bogus pointer */
+       superPtr = (CompositePartPtr)&(((CompositeWidgetClass)widgetClass
+                       ->core_class.superclass)->composite_class);
+
+    /* We don't need to check for null super since we'll get to composite
+       eventually, and it had better define them!  */
+
+    LOCK_PROCESS;
+    if (wcPtr->geometry_manager == XtInheritGeometryManager) {
+       wcPtr->geometry_manager =
+               superPtr->geometry_manager;
+    }
+
+    if (wcPtr->change_managed == XtInheritChangeManaged) {
+       wcPtr->change_managed =
+               superPtr->change_managed;
+       InheritAllowsChangeManagedSet(widgetClass);
+    }
+
+    if (wcPtr->insert_child == XtInheritInsertChild) {
+       wcPtr->insert_child = superPtr->insert_child;
+    }
+
+    if (wcPtr->delete_child == XtInheritDeleteChild) {
+       wcPtr->delete_child = superPtr->delete_child;
+    }
+    UNLOCK_PROCESS;
+}
+
+static void CompositeDestroy(
+    Widget     w)
+{
+    register CompositeWidget cw = (CompositeWidget) w;
+
+    XtFree((char *) cw->composite.children);
+}
+
+static void CompositeInsertChild(
+    Widget     w)
+{
+    register Cardinal       position;
+    register Cardinal        i;
+    register CompositeWidget cw;
+    register WidgetList      children;
+
+    cw = (CompositeWidget) w->core.parent;
+    children = cw->composite.children;
+
+    if (cw->composite.insert_position != NULL)
+       position = (*(cw->composite.insert_position))(w);
+    else
+       position = cw->composite.num_children;
+
+    if (cw->composite.num_children == cw->composite.num_slots) {
+       /* Allocate more space */
+       cw->composite.num_slots +=  (cw->composite.num_slots / 2) + 2;
+       cw->composite.children = children =
+           (WidgetList) XtRealloc((XtPointer) children,
+           (unsigned) (cw->composite.num_slots) * sizeof(Widget));
+    }
+    /* Ripple children up one space from "position" */
+    for (i = cw->composite.num_children; i > position; i--) {
+       children[i] = children[i-1];
+    }
+    children[position] = w;
+    cw->composite.num_children++;
+}
+
+static void CompositeDeleteChild(
+    Widget     w)
+{
+    register Cardinal       position;
+    register Cardinal       i;
+    register CompositeWidget cw;
+
+    cw = (CompositeWidget) w->core.parent;
+
+    for (position = 0; position < cw->composite.num_children; position++) {
+        if (cw->composite.children[position] == w) {
+           break;
+       }
+    }
+    if (position == cw->composite.num_children) return;
+
+    /* Ripple children down one space from "position" */
+    cw->composite.num_children--;
+    for (i = position; i < cw->composite.num_children; i++) {
+        cw->composite.children[i] = cw->composite.children[i+1];
+    }
+}
+
+/* ARGSUSED */
+static void CompositeInitialize(
+    Widget   requested_widget,
+    Widget   new_widget,
+    ArgList args,
+    Cardinal *num_args)
+{
+    register CompositeWidget cw;
+
+    cw = (CompositeWidget) new_widget;
+    cw->composite.num_children = 0;
+    cw->composite.children = NULL;
+    cw->composite.num_slots = 0;
+}
diff --git a/src/Constraint.c b/src/Constraint.c
new file mode 100644 (file)
index 0000000..92b61b6
--- /dev/null
@@ -0,0 +1,141 @@
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+
+static void ConstraintPartInitialize(WidgetClass wc);
+externaldef(constraintclassrec) ConstraintClassRec constraintClassRec = {
+  { /******* CorePart *******/
+    /* superclass          */  (WidgetClass) &compositeClassRec,
+    /* class_name          */  "Constraint",
+    /* widget_size         */  sizeof(ConstraintRec),
+    /* class_initialize     */  NULL,
+    /* class_part_initialize*/ ConstraintPartInitialize,
+    /* class_inited        */  FALSE,
+    /* initialize          */  NULL,
+    /* initialize_hook      */ NULL,
+    /* realize             */  XtInheritRealize,
+    /* actions             */  NULL,
+    /* num_actions         */  0,
+    /* resources           */  NULL,
+    /* num_resources       */  0,
+    /* xrm_class           */  NULLQUARK,
+    /* compress_motion      */ FALSE,
+    /* compress_exposure    */ TRUE,
+    /* compress_enterleave  */  FALSE,
+    /* visible_interest     */ FALSE,
+    /* destroy             */  NULL,
+    /* resize              */  NULL,
+    /* expose              */  NULL,
+    /* set_values          */  NULL,
+    /* 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      */  NULL,
+    /* display_accelerator  */  NULL,
+    /* extension           */  NULL
+  },{ /**** CompositePart *****/
+    /* geometry_handler     */  NULL,
+    /* change_managed       */  NULL,
+    /* insert_child        */  XtInheritInsertChild,
+    /* delete_child        */  XtInheritDeleteChild,
+    /* extension           */  NULL
+  },{ /**** ConstraintPart ****/
+    /* resources           */  NULL,
+    /* num_resources       */  0,
+    /* constraint_size      */  0,
+    /* initialize          */  NULL,
+    /* destroy             */  NULL,
+    /* set_values          */  NULL,
+    /* extension           */  NULL
+  }
+};
+
+externaldef(constraintwidgetclass) WidgetClass constraintWidgetClass =
+       (WidgetClass) &constraintClassRec;
+
+
+static void ConstraintPartInitialize(WidgetClass wc)
+{
+    ConstraintWidgetClass cwc = (ConstraintWidgetClass)wc;
+    if (cwc->constraint_class.resources)
+       _XtCompileResourceList(cwc->constraint_class.resources,
+                              cwc->constraint_class.num_resources);
+
+    _XtConstraintResDependencies((ConstraintWidgetClass)wc);
+}
diff --git a/src/Convert.c b/src/Convert.c
new file mode 100644 (file)
index 0000000..cea8fd3
--- /dev/null
@@ -0,0 +1,1095 @@
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include       "IntrinsicI.h"
+#include       "StringDefs.h"
+#include       "Intrinsic.h"
+
+/* Conversion procedure hash table */
+
+#define CONVERTHASHSIZE        ((unsigned)256)
+#define CONVERTHASHMASK        255
+#define ProcHash(from_type, to_type) (2 * (from_type) + to_type)
+
+typedef struct _ConverterRec *ConverterPtr;
+typedef struct _ConverterRec {
+    ConverterPtr       next;
+    XrmRepresentation  from, to;
+    XtTypeConverter    converter;
+    XtDestructor       destructor;
+    unsigned short     num_args;
+    unsigned int       do_ref_count:1;
+    unsigned int       new_style:1;
+    unsigned int       global:1;
+    char               cache_type;
+} ConverterRec;
+
+#define ConvertArgs(p) ((XtConvertArgList)((p)+1))
+
+/* used for old-style type converter cache only */
+static Heap globalHeap = {NULL, NULL, 0};
+
+void _XtSetDefaultConverterTable(
+       ConverterTable *table)
+{
+    register ConverterTable globalConverterTable;
+
+    LOCK_PROCESS;
+    globalConverterTable = _XtGetProcessContext()->globalConverterTable;
+
+    *table = (ConverterTable)
+       __XtCalloc(CONVERTHASHSIZE, (unsigned)sizeof(ConverterPtr));
+    _XtAddDefaultConverters(*table);
+
+    if (globalConverterTable) {
+       ConverterPtr rec;
+       int i;
+       XtCacheType cache_type;
+       for (i = CONVERTHASHSIZE; --i >= 0; ) {
+           for (rec = *globalConverterTable++; rec; rec = rec->next) {
+               cache_type = rec->cache_type;
+               if (rec->do_ref_count)
+                   cache_type |= XtCacheRefCount;
+              _XtTableAddConverter(*table, rec->from, rec->to, rec->converter,
+                                   ConvertArgs(rec), rec->num_args,
+                                   rec->new_style, cache_type,
+                                   rec->destructor, True);
+           }
+       }
+    }
+    UNLOCK_PROCESS;
+}
+
+void _XtFreeConverterTable(
+       ConverterTable table)
+{
+       register Cardinal i;
+       register ConverterPtr p;
+
+       for (i = 0; i < CONVERTHASHSIZE; i++) {
+           for (p = table[i]; p; ) {
+               register ConverterPtr next = p->next;
+               XtFree((char*)p);
+               p = next;
+           }
+       }
+       XtFree((char*)table);
+}
+
+/* Data cache hash table */
+
+typedef struct _CacheRec *CachePtr;
+
+typedef struct _CacheRec {
+    CachePtr   next;
+    XtPointer  tag;
+    int                hash;
+    XtTypeConverter converter;
+    unsigned short num_args;
+    unsigned int conversion_succeeded:1;
+    unsigned int has_ext:1;
+    unsigned int is_refcounted:1;
+    unsigned int must_be_freed:1;
+    unsigned int from_is_value:1;
+    unsigned int to_is_value:1;
+    XrmValue   from;
+    XrmValue   to;
+} CacheRec;
+
+typedef struct _CacheRecExt {
+    CachePtr   *prev;
+    XtDestructor destructor;
+    XtPointer   closure;
+    long        ref_count;
+} CacheRecExt;
+
+#define CEXT(p) ((CacheRecExt *)((p)+1))
+#define CARGS(p) ((p)->has_ext ? (XrmValue *)(CEXT(p)+1) : (XrmValue *)((p)+1))
+
+#define CACHEHASHSIZE  256
+#define CACHEHASHMASK  255
+typedef CachePtr CacheHashTable[CACHEHASHSIZE];
+
+static CacheHashTable  cacheHashTable;
+
+void _XtTableAddConverter(
+    ConverterTable     table,
+    XrmRepresentation   from_type,
+    XrmRepresentation   to_type,
+    XtTypeConverter    converter,
+    XtConvertArgList    convert_args,
+    Cardinal           num_args,
+    _XtBoolean         new_style,
+    XtCacheType                cache_type,
+    XtDestructor       destructor,
+    _XtBoolean         global)
+{
+    register ConverterPtr      *pp;
+    register ConverterPtr      p;
+    XtConvertArgList args;
+
+    pp= &table[ProcHash(from_type, to_type) & CONVERTHASHMASK];
+    while ((p = *pp) && (p->from != from_type || p->to != to_type))
+       pp = &p->next;
+
+    if (p) {
+       *pp = p->next;
+       XtFree((char *)p);
+    }
+
+    p = (ConverterPtr) __XtMalloc(sizeof(ConverterRec) +
+                               sizeof(XtConvertArgRec) * num_args);
+    p->next        = *pp;
+    *pp = p;
+    p->from        = from_type;
+    p->to          = to_type;
+    p->converter    = converter;
+    p->destructor   = destructor;
+    p->num_args     = num_args;
+    p->global       = global;
+    args = ConvertArgs(p);
+    while (num_args--)
+       *args++ = *convert_args++;
+    p->new_style    = new_style;
+    p->do_ref_count = False;
+    if (destructor || (cache_type & 0xff)) {
+       p->cache_type = cache_type & 0xff;
+       if (cache_type & XtCacheRefCount)
+           p->do_ref_count = True;
+    } else {
+       p->cache_type = XtCacheNone;
+    }
+}
+
+void XtSetTypeConverter(
+    register _Xconst char* from_type,
+    register _Xconst char* to_type,
+    XtTypeConverter    converter,
+    XtConvertArgList    convert_args,
+    Cardinal           num_args,
+    XtCacheType                cache_type,
+    XtDestructor       destructor
+    )
+{
+    ProcessContext process;
+    XtAppContext app;
+    XrmRepresentation from;
+    XrmRepresentation to;
+
+    LOCK_PROCESS;
+    process = _XtGetProcessContext();
+    app = process->appContextList;
+    from = XrmStringToRepresentation(from_type);
+    to = XrmStringToRepresentation(to_type);
+
+    if (!process->globalConverterTable) {
+       process->globalConverterTable = (ConverterTable)
+           __XtCalloc(CONVERTHASHSIZE, (unsigned)sizeof(ConverterPtr));
+    }
+    _XtTableAddConverter(process->globalConverterTable, from, to,
+                        converter, convert_args,
+                        num_args, True, cache_type, destructor, True);
+    while (app) {
+       _XtTableAddConverter(app->converterTable, from, to,
+                            converter, convert_args,
+                            num_args, True, cache_type, destructor, True);
+       app = app->next;
+    }
+    UNLOCK_PROCESS;
+}
+
+void XtAppSetTypeConverter(
+    XtAppContext       app,
+    register _Xconst char* from_type,
+    register _Xconst char* to_type,
+    XtTypeConverter    converter,
+    XtConvertArgList    convert_args,
+    Cardinal           num_args,
+    XtCacheType                cache_type,
+    XtDestructor       destructor
+    )
+{
+    LOCK_PROCESS;
+    _XtTableAddConverter(app->converterTable,
+       XrmStringToRepresentation(from_type),
+        XrmStringToRepresentation(to_type),
+       converter, convert_args, num_args,
+       True, cache_type, destructor, False);
+    UNLOCK_PROCESS;
+}
+
+/* old interface */
+void XtAddConverter(
+    register _Xconst char* from_type,
+    register _Xconst char* to_type,
+    XtConverter                converter,
+    XtConvertArgList    convert_args,
+    Cardinal           num_args
+    )
+{
+    ProcessContext process;
+    XtAppContext app;
+    XrmRepresentation from;
+    XrmRepresentation to;
+
+    LOCK_PROCESS;
+    process = _XtGetProcessContext();
+    app = process->appContextList;
+    from = XrmStringToRepresentation(from_type);
+    to = XrmStringToRepresentation(to_type);
+
+    if (!process->globalConverterTable) {
+       process->globalConverterTable = (ConverterTable)
+           __XtCalloc(CONVERTHASHSIZE, (unsigned)sizeof(ConverterPtr));
+    }
+    _XtTableAddConverter(process->globalConverterTable, from, to,
+                        (XtTypeConverter)converter, convert_args, num_args,
+                        False, XtCacheAll, (XtDestructor)NULL, True);
+    while (app) {
+       _XtTableAddConverter(app->converterTable, from, to,
+                            (XtTypeConverter)converter, convert_args,
+                            num_args, False, XtCacheAll, (XtDestructor)NULL,
+                            True);
+       app = app->next;
+    }
+    UNLOCK_PROCESS;
+}
+
+/* old interface */
+void XtAppAddConverter(
+    XtAppContext       app,
+    register _Xconst char* from_type,
+    register _Xconst char* to_type,
+    XtConverter                converter,
+    XtConvertArgList    convert_args,
+    Cardinal           num_args
+    )
+{
+    LOCK_PROCESS;
+    _XtTableAddConverter(app->converterTable,
+       XrmStringToRepresentation(from_type),
+        XrmStringToRepresentation(to_type),
+       (XtTypeConverter)converter, convert_args, num_args,
+       False, XtCacheAll, (XtDestructor)NULL, False);
+    UNLOCK_PROCESS;
+}
+
+static CachePtr
+CacheEnter(
+    Heap*                  heap,
+    register XtTypeConverter converter,
+    register XrmValuePtr    args,
+    Cardinal               num_args,
+    XrmValuePtr                    from,
+    XrmValuePtr                    to,
+    Boolean                succeeded,
+    register int           hash,
+    Boolean                do_ref,
+    Boolean                do_free,
+    XtDestructor           destructor,
+    XtPointer              closure)
+{
+    register   CachePtr *pHashEntry;
+    register   CachePtr p;
+    register    Cardinal i;
+
+    LOCK_PROCESS;
+    pHashEntry = &cacheHashTable[hash & CACHEHASHMASK];
+
+    if ((succeeded && destructor) || do_ref) {
+       p = (CachePtr) _XtHeapAlloc(heap, (sizeof(CacheRec) +
+                                          sizeof(CacheRecExt) +
+                                          num_args * sizeof(XrmValue)));
+       CEXT(p)->prev = pHashEntry;
+       CEXT(p)->destructor = succeeded ? destructor : NULL;
+       CEXT(p)->closure = closure;
+       CEXT(p)->ref_count = 1;
+       p->has_ext = True;
+    }
+    else {
+       p = (CachePtr)_XtHeapAlloc(heap, (sizeof(CacheRec) +
+                                         num_args * sizeof(XrmValue)));
+       p->has_ext = False;
+    }
+    if (!to->addr)
+       succeeded = False;
+    p->conversion_succeeded = succeeded;
+    p->is_refcounted = do_ref;
+    p->must_be_freed = do_free;
+    p->next        = *pHashEntry;
+    if (p->next && p->next->has_ext)
+       CEXT(p->next)->prev = &p->next;
+
+    *pHashEntry     = p;
+    p->tag         = (XtPointer)heap;
+    p->hash        = hash;
+    p->converter    = converter;
+    p->from.size    = from->size;
+    if (from->size <= sizeof(p->from.addr)) {
+       p->from_is_value = True;
+       XtMemmove(&p->from.addr, from->addr, from->size);
+    } else {
+       p->from_is_value = False;
+       p->from.addr = (XPointer)_XtHeapAlloc(heap, from->size);
+       (void) memmove((char *)p->from.addr, (char *)from->addr, from->size);
+    }
+    p->num_args = num_args;
+    if (num_args) {
+       XrmValue *pargs = CARGS(p);
+       for (i = 0; i < num_args; i++) {
+           pargs[i].size = args[i].size;
+           pargs[i].addr = (XPointer)_XtHeapAlloc(heap, args[i].size);
+           XtMemmove(pargs[i].addr, args[i].addr, args[i].size);
+       }
+    }
+    p->to.size = to->size;
+    if (!succeeded) {
+       p->to_is_value = False;
+       p->to.addr = NULL;
+    } else if (to->size <= sizeof(p->to.addr)) {
+       p->to_is_value = True;
+       XtMemmove(&p->to.addr, to->addr, to->size);
+    } else {
+       p->to_is_value = False;
+       p->to.addr = (XPointer)_XtHeapAlloc(heap, to->size);
+       (void) memmove((char *)p->to.addr, (char *)to->addr, to->size);
+    }
+    UNLOCK_PROCESS;
+    return p;
+}
+
+static void FreeCacheRec(
+    XtAppContext app,
+    CachePtr p,
+    CachePtr *prev)
+{
+    LOCK_PROCESS;
+    if (p->has_ext) {
+       if (CEXT(p)->destructor) {
+           Cardinal num_args = p->num_args;
+           XrmValue *args = NULL;
+           XrmValue toc;
+           if (num_args)
+               args = CARGS(p);
+           toc.size = p->to.size;
+           if (p->to_is_value)
+               toc.addr = (XPointer)&p->to.addr;
+           else
+               toc.addr = p->to.addr;
+           (*CEXT(p)->destructor) (app, &toc, CEXT(p)->closure, args,
+                                   &num_args);
+       }
+       *(CEXT(p)->prev) = p->next;
+       if (p->next && p->next->has_ext)
+           CEXT(p->next)->prev = CEXT(p)->prev;
+    } else {
+       *prev = p->next;
+       if (p->next && p->next->has_ext)
+           CEXT(p->next)->prev = prev;
+    }
+    if (p->must_be_freed) {
+       register int i;
+       if (!p->from_is_value)
+           XtFree(p->from.addr);
+       if ((i = p->num_args)) {
+           XrmValue *pargs = CARGS(p);
+           while (i--)
+               XtFree(pargs[i].addr);
+       }
+       if (!p->to_is_value)
+           XtFree(p->to.addr);
+       XtFree((char*)p);
+    }
+    /* else on private heap; will free entire heap later */
+    UNLOCK_PROCESS;
+}
+
+
+void _XtCacheFlushTag(
+    XtAppContext app,
+    XtPointer  tag)
+{
+    int i;
+    register CachePtr *prev;
+    register CachePtr rec;
+
+    LOCK_PROCESS;
+    for (i = CACHEHASHSIZE; --i >= 0;) {
+       prev = &cacheHashTable[i];
+       while ((rec = *prev)) {
+           if (rec->tag == tag)
+               FreeCacheRec(app, rec, prev);
+           else
+               prev = &rec->next;
+       }
+    }
+    UNLOCK_PROCESS;
+}
+
+#ifdef DEBUG
+#include       <stdio.h>
+
+void _XtConverterCacheStats(void)
+{
+    register Cardinal i;
+    register CachePtr p;
+    register Cardinal entries;
+
+    LOCK_PROCESS;
+    for (i = 0; i < CACHEHASHSIZE; i++) {
+       p = cacheHashTable[i];
+       if (p) {
+           for (entries = 0; p; p = p->next) {
+               entries++;
+           }
+           (void) fprintf(stdout, "Index: %4d  Entries: %d\n", i, entries);
+           for (p = cacheHashTable[i]; p; p = p->next) {
+               (void) fprintf(stdout, "    Size: %3d  Refs: %3d  '",
+                              p->from.size,
+                              p->has_ext ? CEXT(p)->ref_count : 0);
+               (void) fprintf(stdout, "'\n");
+           }
+           (void) fprintf(stdout, "\n");
+       }
+    }
+    UNLOCK_PROCESS;
+}
+#endif /*DEBUG*/
+
+static Boolean ResourceQuarkToOffset(
+    WidgetClass widget_class,
+    XrmName     name,
+    Cardinal    *offset)
+{
+    register WidgetClass     wc;
+    register Cardinal        i;
+    register XrmResourceList res, *resources;
+
+    for (wc = widget_class; wc; wc = wc->core_class.superclass) {
+       resources = (XrmResourceList*) wc->core_class.resources;
+       for (i = 0; i < wc->core_class.num_resources; i++, resources++) {
+           res = *resources;
+           if (res->xrm_name == name) {
+               *offset = -res->xrm_offset - 1;
+               return True;
+           }
+       } /* for i in resources */
+    } /* for wc in widget classes */
+    (*offset) = 0;
+    return False;
+}
+
+
+static void ComputeArgs(
+    Widget             widget,
+    XtConvertArgList    convert_args,
+    Cardinal           num_args,
+    XrmValuePtr                args)
+{
+    register Cardinal   i;
+    Cardinal           offset;
+    String              params[1];
+    Cardinal           num_params = 1;
+    Widget             ancestor = NULL;
+
+    for (i = 0; i < num_args; i++) {
+       args[i].size = convert_args[i].size;
+       switch (convert_args[i].address_mode) {
+       case XtAddress:
+           args[i].addr = convert_args[i].address_id;
+           break;
+
+       case XtBaseOffset:
+           args[i].addr =
+               (XPointer)((char *)widget + (long)convert_args[i].address_id);
+           break;
+
+       case XtWidgetBaseOffset:
+           if (!ancestor) {
+               if (XtIsWidget(widget))
+                   ancestor = widget;
+               else
+                   ancestor = _XtWindowedAncestor(widget);
+           }
+
+           args[i].addr =
+               (XPointer)((char *)ancestor + (long)convert_args[i].address_id);
+           break;
+
+       case XtImmediate:
+           args[i].addr = (XPointer) &(convert_args[i].address_id);
+           break;
+
+       case XtProcedureArg:
+           (*(XtConvertArgProc)convert_args[i].address_id)
+               (widget, &convert_args[i].size, &args[i]);
+           break;
+
+       case XtResourceString:
+           /* Convert in place for next usage */
+           convert_args[i].address_mode = XtResourceQuark;
+           convert_args[i].address_id =
+              (XtPointer)(long)XrmStringToQuark((String)convert_args[i].address_id);
+           /* Fall through */
+
+       case XtResourceQuark:
+           if (! ResourceQuarkToOffset(widget->core.widget_class,
+                   (XrmQuark)(long) convert_args[i].address_id, &offset)) {
+               params[0]=
+                  XrmQuarkToString((XrmQuark)(long) convert_args[i].address_id);
+               XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+                   "invalidResourceName","computeArgs",XtCXtToolkitError,
+                   "Cannot find resource name %s as argument to conversion",
+                     params,&num_params);
+               offset = 0;
+           }
+           args[i].addr = (XPointer)((char *)widget + offset);
+           break;
+       default:
+           params[0] = XtName(widget);
+           XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+               "invalidAddressMode", "computeArgs", XtCXtToolkitError,
+               "Conversion arguments for widget '%s' contain an unsupported address mode",
+                       params,&num_params);
+           args[i].addr = NULL;
+           args[i].size = 0;
+       } /* switch */
+    } /* for */
+} /* ComputeArgs */
+
+void XtDirectConvert(
+    XtConverter     converter,
+    XrmValuePtr     args,
+    Cardinal       num_args,
+    register XrmValuePtr from,
+    XrmValuePtr     to)
+{
+    register CachePtr   p;
+    register int       hash;
+    register Cardinal   i;
+
+    LOCK_PROCESS;
+    /* Try to find cache entry for conversion */
+    hash = ((long) converter >> 2) + from->size + *((char *) from->addr);
+    if (from->size > 1) hash += ((char *) from->addr)[1];
+
+    for (p = cacheHashTable[hash & CACHEHASHMASK]; p; p = p->next) {
+       if ((p->hash == hash)
+        && (p->converter == (XtTypeConverter)converter)
+        && (p->from.size == from->size)
+        && !(p->from_is_value ?
+             XtMemcmp(&p->from.addr, from->addr, from->size) :
+             memcmp((char *)p->from.addr, (char *)from->addr, from->size))
+         && (p->num_args == num_args)) {
+           if ((i = num_args)) {
+               XrmValue *pargs = CARGS(p);
+               /* Are all args the same data ? */
+               while (i) {
+                   i--; /* do not move to while test, broken compilers */
+                   if (pargs[i].size != args[i].size ||
+                       XtMemcmp(pargs[i].addr, args[i].addr, args[i].size)) {
+                       i++;
+                       break;
+                   }
+               }
+           }
+           if (!i) {
+               /* Perfect match */
+               to->size = p->to.size;
+               if (p->to_is_value)
+                   to->addr = (XPointer)&p->to.addr;
+               else
+                   to->addr = p->to.addr;
+               UNLOCK_PROCESS;
+               return;
+           }
+       }
+    }
+
+    /* Didn't find it, call converter procedure and entry result in cache */
+    (*to).size = 0;
+    (*to).addr = NULL;
+    (*converter)(args, &num_args, from, to);
+    /* This memory can never be freed since we don't know the Display
+     * or app context from which to compute the persistance */
+    {
+       CacheEnter(&globalHeap, (XtTypeConverter)converter, args, num_args,
+                  from, to, (to->addr != NULL), hash, False, False,
+                  (XtDestructor)NULL, NULL);
+    }
+    UNLOCK_PROCESS;
+}
+
+
+static ConverterPtr GetConverterEntry(
+    XtAppContext app,
+    XtTypeConverter converter)
+{
+    Cardinal entry;
+    register ConverterPtr cP;
+    ConverterTable converterTable;
+
+    LOCK_PROCESS;
+    converterTable = app->converterTable;
+    cP = NULL;
+    for (entry = 0; (entry < CONVERTHASHSIZE) && !cP; entry++) {
+       cP = converterTable[entry];
+       while (cP && (cP->converter != converter)) cP = cP->next;
+    }
+    UNLOCK_PROCESS;
+    return cP;
+}
+
+
+static Boolean
+CallConverter(
+    Display*       dpy,
+    XtTypeConverter converter,
+    XrmValuePtr     args,
+    Cardinal       num_args,
+    register XrmValuePtr from,
+    XrmValuePtr     to,
+    XtCacheRef     *cache_ref_return,
+    register ConverterPtr cP)
+{
+    CachePtr p;
+    int        hash;
+    Cardinal i;
+    Boolean retval;
+
+    if (!cP || ((cP->cache_type == XtCacheNone) && !cP->destructor)) {
+       XtPointer closure;
+       if (cache_ref_return) *cache_ref_return = NULL;
+       retval = (*(XtTypeConverter)converter)
+           (dpy, args, &num_args, from, to, &closure);
+       return retval;
+    }
+
+    LOCK_PROCESS;
+    /* Try to find cache entry for conversion */
+    hash = ((long)(converter) >> 2) + from->size + *((char *) from->addr);
+    if (from->size > 1) hash += ((char *) from->addr)[1];
+
+    if (cP->cache_type != XtCacheNone) {
+       for (p = cacheHashTable[hash & CACHEHASHMASK]; p; p = p->next){
+           if ((p->hash == hash)
+            && (p->converter == converter)
+            && (p->from.size == from->size)
+            && !(p->from_is_value ?
+                 XtMemcmp(&p->from.addr, from->addr, from->size) :
+                 memcmp((char *)p->from.addr, (char *)from->addr, from->size))
+            && (p->num_args == num_args)) {
+               if ((i = num_args)) {
+                   XrmValue *pargs = CARGS(p);
+                   /* Are all args the same data ? */
+                   while (i) {
+                       i--; /* do not move to while test, broken compilers */
+                       if (pargs[i].size != args[i].size ||
+                           XtMemcmp(pargs[i].addr, args[i].addr, args[i].size)){
+                           i++;
+                           break;
+                       }
+                   }
+               }
+               if (!i) {
+                   /* Perfect match */
+                   if (p->conversion_succeeded) {
+                       if (to->addr) { /* new-style call */
+                           if (to->size < p->to.size) {
+                               to->size = p->to.size;
+                               UNLOCK_PROCESS;
+                               return False;
+                           }
+                           to->size = p->to.size;
+                           if (p->to_is_value) {
+                               XtMemmove(to->addr, &p->to.addr,
+                                         to->size);
+                           } else {
+                               (void) memmove((char *)to->addr,
+                                              (char *)p->to.addr, to->size);
+                           }
+                       } else {        /* old-style call */
+                           to->size = p->to.size;
+                           if (p->to_is_value)
+                               to->addr = (XPointer)&p->to.addr;
+                           else
+                               to->addr = p->to.addr;
+                       }
+                   }
+                   if (p->is_refcounted) {
+                       CEXT(p)->ref_count++;
+                       if (cache_ref_return)
+                           *cache_ref_return = (XtCacheRef)p;
+                       else
+                           p->is_refcounted = False;
+                   }
+                   else {
+                       if (cache_ref_return)
+                           *cache_ref_return = NULL;
+                   }
+                   retval = (p->conversion_succeeded);
+                   UNLOCK_PROCESS;
+                   return retval;
+               }
+           }
+       }
+    }
+
+    /* No cache entry, call converter procedure and enter result in cache */
+    {
+       Heap *heap;
+       XtPointer closure = NULL;
+       unsigned int supplied_size = to->size;
+       Boolean do_ref = cP->do_ref_count && cache_ref_return;
+       Boolean do_free = False;
+       Boolean retval =
+           (*(XtTypeConverter)converter)(dpy, args, &num_args, from, to, &closure);
+
+       if (retval == False && supplied_size < to->size) {
+           /* programmer error: caller must allocate sufficient storage */
+           if (cache_ref_return)
+               *cache_ref_return = NULL;
+           UNLOCK_PROCESS;
+           return False;
+       }
+
+       if ((cP->cache_type == XtCacheNone) || do_ref) {
+           heap = NULL;
+           do_free = True;
+       }
+       else if (cP->cache_type == XtCacheByDisplay)
+           heap = &_XtGetPerDisplay(dpy)->heap;
+       else if (cP->global)
+           heap = &globalHeap;
+       else
+           heap = &XtDisplayToApplicationContext(dpy)->heap;
+
+       p = CacheEnter(heap, converter, args, num_args, from, to, retval,
+                      hash, do_ref, do_free, cP->destructor, closure);
+       if (do_ref)
+           *cache_ref_return = (XtCacheRef)p;
+       else if (cache_ref_return)
+           *cache_ref_return = NULL;
+       UNLOCK_PROCESS;
+       return retval;
+    }
+}
+
+Boolean
+XtCallConverter(
+    Display*       dpy,
+    XtTypeConverter converter,
+    XrmValuePtr     args,
+    Cardinal       num_args,
+    register XrmValuePtr from,
+    XrmValuePtr     to,
+    XtCacheRef     *cache_ref_return)
+{
+    ConverterPtr cP;
+    Boolean retval;
+    XtAppContext app = XtDisplayToApplicationContext(dpy);
+
+    LOCK_APP(app);
+    if ((cP = GetConverterEntry(app, converter)) == NULL) {
+       XtAppSetTypeConverter(XtDisplayToApplicationContext(dpy),
+                             "_XtUnk1", "_XtUnk2",
+                             converter, NULL, 0,
+                             XtCacheAll, NULL);
+       cP = GetConverterEntry(app, converter);
+    }
+    retval = CallConverter(dpy, converter, args, num_args, from, to,
+                           cache_ref_return, cP);
+    UNLOCK_APP(app);
+    return retval;
+}
+
+Boolean _XtConvert(
+             Widget            widget,
+    register XrmRepresentation from_type,
+            XrmValuePtr        from,
+    register XrmRepresentation to_type,
+    register XrmValuePtr       to,
+    XtCacheRef                 *cache_ref_return)
+{
+    XtAppContext       app = XtWidgetToApplicationContext(widget);
+    register ConverterPtr      p;
+    Cardinal           num_args;
+    XrmValue           *args;
+
+    /* Look for type converter */
+    LOCK_PROCESS;
+    p = app->converterTable[ProcHash(from_type, to_type) & CONVERTHASHMASK];
+    for (; p; p = p->next) {
+       if (from_type == p->from && to_type == p->to) {
+           Boolean retval = False;
+           /* Compute actual arguments from widget and arg descriptor */
+           num_args = p->num_args;
+           if (num_args != 0) {
+               args = (XrmValue*)
+                   ALLOCATE_LOCAL( num_args * sizeof (XrmValue) );
+               if (!args) _XtAllocError("alloca");
+               ComputeArgs(widget, ConvertArgs(p), num_args, args);
+           } else args = NULL;
+           if (p->new_style) {
+               retval =
+                   CallConverter(XtDisplayOfObject(widget),
+                                    p->converter, args, num_args,
+                                    from, to, cache_ref_return, p);
+           }
+           else { /* is old-style (non-display) converter */
+               XrmValue tempTo;
+               XtDirectConvert((XtConverter)p->converter, args, num_args,
+                               from, &tempTo);
+               if (cache_ref_return)
+                   *cache_ref_return = NULL;
+               if (tempTo.addr) {
+                   if (to->addr) {     /* new-style caller */
+                       if (to->size >= tempTo.size) {
+                           if (to_type == _XtQString)
+                               *(String*)(to->addr) = tempTo.addr;
+                           else {
+                               XtMemmove(to->addr, tempTo.addr,
+                                         tempTo.size);
+                           }
+                           retval = True;
+                       }
+                       to->size = tempTo.size;
+                   } else {            /* old-style caller */
+                       *to = tempTo;
+                       retval = True;
+                   }
+               }
+           }
+           if (args) DEALLOCATE_LOCAL( (XtPointer)args );
+           UNLOCK_PROCESS;
+           return retval;
+       }
+    }
+
+    {
+       String params[2];
+       Cardinal num_params = 2;
+       params[0] = XrmRepresentationToString(from_type);
+       params[1] = XrmRepresentationToString(to_type);
+       XtAppWarningMsg(app, "typeConversionError", "noConverter", XtCXtToolkitError,
+            "No type converter registered for '%s' to '%s' conversion.",
+             params, &num_params);
+    }
+    UNLOCK_PROCESS;
+    return False;
+}
+
+void XtConvert(
+    Widget     widget,
+    _Xconst char* from_type_str,
+    XrmValuePtr        from,
+    _Xconst char* to_type_str,
+    XrmValuePtr        to)
+{
+    XrmQuark    from_type, to_type;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    from_type = XrmStringToRepresentation(from_type_str);
+    to_type = XrmStringToRepresentation(to_type_str);
+    if (from_type != to_type) {
+       /*  It's not safe to ref count these resources, 'cause we
+           don't know what older clients may have assumed about
+           the resource lifetimes.
+       XtCacheRef ref;
+       */
+       to->addr = NULL;
+       to->size = 0;
+       _XtConvert(widget, from_type, from, to_type, to, /*&ref*/ NULL);
+       /*
+       if (ref) {
+           XtAddCallback( widget, XtNdestroyCallback,
+                          XtCallbackReleaseCacheRef, (XtPointer)ref );
+       }
+       */
+    }
+    else
+       (*to) = *from;
+    UNLOCK_APP(app);
+}
+
+Boolean XtConvertAndStore(
+    Widget     object,
+    _Xconst char* from_type_str,
+    XrmValuePtr        from,
+    _Xconst char* to_type_str,
+    XrmValuePtr        to)
+{
+    XrmQuark    from_type, to_type;
+    WIDGET_TO_APPCON(object);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    from_type = XrmStringToRepresentation(from_type_str);
+    to_type = XrmStringToRepresentation(to_type_str);
+    if (from_type != to_type) {
+       static XtPointer local_valueP = NULL;
+       static Cardinal local_valueS = 128;
+       XtCacheRef ref;
+       Boolean local = False;
+       do {
+           if (!to->addr) {
+               if (!local_valueP)
+                   local_valueP = _XtHeapAlloc(&globalHeap, local_valueS);
+               to->addr = local_valueP;
+               to->size = local_valueS;
+               local = True;
+           }
+           if (!_XtConvert(object, from_type, from, to_type, to, &ref)) {
+               if (local && (to->size > local_valueS)) {
+                   to->addr =
+                       local_valueP = _XtHeapAlloc(&globalHeap, to->size);
+                   local_valueS = to->size;
+                   continue;
+               } else {
+                   if (local) {
+                       to->addr = NULL;
+                       to->size = 0;
+                   }
+                   UNLOCK_PROCESS;
+                   UNLOCK_APP(app);
+                   return False;
+               }
+           }
+           if (ref) {
+               XtAddCallback( object, XtNdestroyCallback,
+                              XtCallbackReleaseCacheRef, (XtPointer)ref );
+           }
+           UNLOCK_PROCESS;
+           UNLOCK_APP(app);
+           return True;
+       } while (local /* && local_valueS < to->size */);
+    }
+    if (to->addr) {
+       if (to->size < from->size) {
+           to->size = from->size;
+           UNLOCK_PROCESS;
+           UNLOCK_APP(app);
+           return False;
+       }
+       (void) memmove(to->addr, from->addr, from->size );
+       to->size = from->size;
+    } else                     /* from_type == to_type */
+       *to = *from;
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+    return True;
+}
+
+void XtAppReleaseCacheRefs(
+    XtAppContext app,
+    XtCacheRef *refs)
+{
+    register CachePtr *r;
+    register CachePtr p;
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    for (r = (CachePtr*)refs; (p = *r); r++) {
+       if (p->is_refcounted && --(CEXT(p)->ref_count) == 0) {
+           FreeCacheRec(app, p, NULL);
+       }
+    }
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+}
+
+
+/* ARGSUSED */
+void XtCallbackReleaseCacheRefList(
+    Widget widget,             /* unused */
+    XtPointer closure,
+    XtPointer call_data)       /* unused */
+{
+    XtAppReleaseCacheRefs( XtWidgetToApplicationContext(widget),
+                          (XtCacheRef*)closure );
+    XtFree(closure);
+}
+
+
+/* ARGSUSED */
+void XtCallbackReleaseCacheRef(
+    Widget widget,             /* unused */
+    XtPointer closure,
+    XtPointer call_data)       /* unused */
+{
+    XtCacheRef cache_refs[2];
+    cache_refs[0] = (XtCacheRef)closure;
+    cache_refs[1] = NULL;
+    XtAppReleaseCacheRefs( XtWidgetToApplicationContext(widget), cache_refs );
+}
diff --git a/src/Converters.c b/src/Converters.c
new file mode 100644 (file)
index 0000000..7649802
--- /dev/null
@@ -0,0 +1,1872 @@
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+/*LINTLIBRARY*/
+/* Conversion.c - implementations of resource type conversion procs */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include       "IntrinsicI.h"
+#include       "StringDefs.h"
+#include       "Shell.h"
+#include       <stdio.h>
+#include        <X11/cursorfont.h>
+#include       <X11/keysym.h>
+#include       <X11/Xlocale.h>
+#include       <errno.h>       /* for StringToDirectoryString */
+
+#ifdef __UNIXOS2__
+#define IsNewline(str) ((str) == '\n' || (str) == '\r')
+#define IsWhitespace(str) ((str)== ' ' || (str) == '\t' || (str) == '\r')
+#else
+#define IsNewline(str) ((str) == '\n')
+#define IsWhitespace(str) ((str)== ' ' || (str) == '\t')
+#endif
+
+static const String XtNwrongParameters = "wrongParameters";
+static const String XtNconversionError = "conversionError";
+static const String XtNmissingCharsetList = "missingCharsetList";
+
+/* Representation types */
+
+#define XtQAtom                        XrmPermStringToQuark(XtRAtom)
+#define XtQCommandArgArray     XrmPermStringToQuark(XtRCommandArgArray)
+#define XtQCursor              XrmPermStringToQuark(XtRCursor)
+#define XtQDirectoryString     XrmPermStringToQuark(XtRDirectoryString)
+#define XtQDisplay             XrmPermStringToQuark(XtRDisplay)
+#define XtQFile                        XrmPermStringToQuark(XtRFile)
+#define XtQFloat               XrmPermStringToQuark(XtRFloat)
+#define XtQInitialState                XrmPermStringToQuark(XtRInitialState)
+#define XtQPixmap              XrmPermStringToQuark(XtRPixmap)
+#define XtQRestartStyle        XrmPermStringToQuark(XtRRestartStyle)
+#define XtQShort               XrmPermStringToQuark(XtRShort)
+#define XtQUnsignedChar                XrmPermStringToQuark(XtRUnsignedChar)
+#define XtQVisual              XrmPermStringToQuark(XtRVisual)
+
+static XrmQuark  XtQBool;
+static XrmQuark  XtQBoolean;
+static XrmQuark  XtQColor;
+static XrmQuark  XtQDimension;
+static XrmQuark  XtQFont;
+static XrmQuark  XtQFontSet;
+static XrmQuark  XtQFontStruct;
+static XrmQuark  XtQGravity;
+static XrmQuark  XtQInt;
+static XrmQuark  XtQPixel;
+static XrmQuark  XtQPosition;
+#ifdef __UNIXOS2__
+XrmQuark  _XtQString = 0;
+#else
+XrmQuark  _XtQString;
+#endif
+
+void _XtConvertInitialize(void)
+{
+    XtQBool            = XrmPermStringToQuark(XtRBool);
+    XtQBoolean         = XrmPermStringToQuark(XtRBoolean);
+    XtQColor           = XrmPermStringToQuark(XtRColor);
+    XtQDimension       = XrmPermStringToQuark(XtRDimension);
+    XtQFont            = XrmPermStringToQuark(XtRFont);
+    XtQFontSet         = XrmPermStringToQuark(XtRFontSet);
+    XtQFontStruct      = XrmPermStringToQuark(XtRFontStruct);
+    XtQGravity         = XrmPermStringToQuark(XtRGravity);
+    XtQInt             = XrmPermStringToQuark(XtRInt);
+    XtQPixel           = XrmPermStringToQuark(XtRPixel);
+    XtQPosition                = XrmPermStringToQuark(XtRPosition);
+    _XtQString         = XrmPermStringToQuark(XtRString);
+}
+
+#define        donestr(type, value, tstr) \
+       {                                                       \
+           if (toVal->addr != NULL) {                          \
+               if (toVal->size < sizeof(type)) {               \
+                   toVal->size = sizeof(type);                 \
+                   XtDisplayStringConversionWarning(dpy,       \
+                       (char*) fromVal->addr, tstr);           \
+                   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;                                        \
+       }
+
+#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;                                        \
+       }
+
+void XtDisplayStringConversionWarning(
+    Display* dpy,
+    _Xconst char* from,
+    _Xconst char* toType
+    )
+{
+#ifndef NO_MIT_HACKS
+    /* Allow suppression of conversion warnings. %%%  Not specified. */
+
+    static enum {Check, Report, Ignore} report_it = Check;
+    XtAppContext app = XtDisplayToApplicationContext(dpy);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    if (report_it == Check) {
+       XrmDatabase rdb = XtDatabase(dpy);
+       XrmName xrm_name[2];
+       XrmClass xrm_class[2];
+       XrmRepresentation rep_type;
+       XrmValue value;
+       xrm_name[0] = XrmPermStringToQuark( "stringConversionWarnings" );
+       xrm_name[1] = 0;
+       xrm_class[0] = XrmPermStringToQuark( "StringConversionWarnings" );
+       xrm_class[1] = 0;
+       if (XrmQGetResource( rdb, xrm_name, xrm_class,
+                            &rep_type, &value ))
+       {
+           if (rep_type == XtQBoolean)
+               report_it = *(Boolean*)value.addr ? Report : Ignore;
+           else if (rep_type == _XtQString) {
+               XrmValue toVal;
+               Boolean report;
+               toVal.addr = (XPointer)&report;
+               toVal.size = sizeof(Boolean);
+               if (XtCallConverter(dpy, XtCvtStringToBoolean, (XrmValuePtr)NULL,
+                                   (Cardinal)0, &value, &toVal,
+                                   (XtCacheRef*)NULL))
+                   report_it = report ? Report : Ignore;
+           }
+           else report_it = Report;
+       }
+       else report_it = Report;
+    }
+
+    if (report_it == Report) {
+#endif /* ifndef NO_MIT_HACKS */
+       String params[2];
+       Cardinal num_params = 2;
+       params[0] = (String)from;
+       params[1] = (String)toType;
+       XtAppWarningMsg(app,
+                  XtNconversionError,"string",XtCXtToolkitError,
+                  "Cannot convert string \"%s\" to type %s",
+                   params,&num_params);
+#ifndef NO_MIT_HACKS
+    }
+#endif /* ifndef NO_MIT_HACKS */
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+}
+
+void XtStringConversionWarning(
+    _Xconst char* from,
+    _Xconst char* toType
+    )
+{
+       String params[2];
+       Cardinal num_params = 2;
+       params[0] = (String)from;
+       params[1] = (String)toType;
+       XtWarningMsg(XtNconversionError,"string",XtCXtToolkitError,
+                  "Cannot convert string \"%s\" to type %s",
+                   params,&num_params);
+}
+
+static int CompareISOLatin1(const char *, const char *);
+
+
+static Boolean IsInteger(
+    String string,
+    int *value)
+{
+    Boolean foundDigit = False;
+    Boolean isNegative = False;
+    Boolean isPositive = False;
+    int val = 0;
+    char ch;
+    /* skip leading whitespace */
+#ifndef __UNIXOS2__
+    while ((ch = *string) == ' ' || ch == '\t') string++;
+#else
+    while ((ch = *string) == ' ' || ch == '\t' || ch == '\r') string++;
+#endif
+    while ((ch = *string++)) {
+       if (ch >= '0' && ch <= '9') {
+           val *= 10;
+           val += ch - '0';
+           foundDigit = True;
+           continue;
+       }
+       if (IsWhitespace(ch)) {
+           if (!foundDigit) return False;
+           /* make sure only trailing whitespace */
+           while ((ch = *string++)) {
+               if (!IsWhitespace(ch))
+                   return False;
+           }
+           break;
+       }
+       if (ch == '-' && !foundDigit && !isNegative && !isPositive) {
+           isNegative = True;
+           continue;
+       }
+       if (ch == '+' && !foundDigit && !isNegative && !isPositive) {
+           isPositive = True;
+           continue;
+       }
+       return False;
+    }
+    if (ch == '\0') {
+       if (isNegative)
+           *value = -val;
+       else
+           *value = val;
+       return True;
+    }
+    return False;
+}
+
+
+/*ARGSUSED*/
+Boolean XtCvtIntToBoolean(
+    Display*   dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr        fromVal,
+    XrmValuePtr        toVal,
+    XtPointer  *closure_ret)
+{
+    if (*num_args != 0)
+       XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+                 XtNwrongParameters,"cvtIntToBoolean",XtCXtToolkitError,
+                  "Integer to Boolean conversion needs no extra arguments",
+                   (String *)NULL, (Cardinal *)NULL);
+    done(Boolean, (*(int *)fromVal->addr != 0));
+}
+
+
+/*ARGSUSED*/
+Boolean XtCvtIntToShort(
+    Display*   dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr        fromVal,
+    XrmValuePtr        toVal,
+    XtPointer  *closure_ret)
+{
+    if (*num_args != 0)
+       XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+                 XtNwrongParameters,"cvtIntToShort",XtCXtToolkitError,
+                  "Integer to Short conversion needs no extra arguments",
+                   (String *)NULL, (Cardinal *)NULL);
+    done(short, (*(int *)fromVal->addr));
+}
+
+
+/*ARGSUSED*/
+Boolean XtCvtStringToBoolean(
+    Display*   dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr        fromVal,
+    XrmValuePtr        toVal,
+    XtPointer  *closure_ret)
+{
+    String str = (String)fromVal->addr;
+    if (*num_args != 0)
+       XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+                 XtNwrongParameters,"cvtStringToBoolean",XtCXtToolkitError,
+                  "String to Boolean conversion needs no extra arguments",
+                   (String *)NULL, (Cardinal *)NULL);
+
+    if (   (CompareISOLatin1(str, "true") == 0)
+       || (CompareISOLatin1(str, "yes") == 0)
+       || (CompareISOLatin1(str, "on") == 0)
+       || (CompareISOLatin1(str, "1") == 0))   donestr( Boolean, True, XtRBoolean );
+
+    if (   (CompareISOLatin1(str, "false") == 0)
+       || (CompareISOLatin1(str, "no") == 0)
+       || (CompareISOLatin1(str, "off") == 0)
+       || (CompareISOLatin1(str, "0") == 0))   donestr( Boolean, False, XtRBoolean );
+
+    XtDisplayStringConversionWarning(dpy, str, XtRBoolean);
+    return False;
+}
+
+
+/*ARGSUSED*/
+Boolean XtCvtIntToBool(
+    Display*   dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr        fromVal,
+    XrmValuePtr        toVal,
+    XtPointer  *closure_ret)
+{
+    if (*num_args != 0)
+       XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+                 XtNwrongParameters,"cvtIntToBool",XtCXtToolkitError,
+                  "Integer to Bool conversion needs no extra arguments",
+                   (String *)NULL, (Cardinal *)NULL);
+    done(Bool, (*(int *)fromVal->addr != 0));
+}
+
+
+/*ARGSUSED*/
+Boolean XtCvtStringToBool(
+    Display*   dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr        fromVal,
+    XrmValuePtr        toVal,
+    XtPointer  *closure_ret)
+{
+    String str = (String)fromVal->addr;
+    if (*num_args != 0)
+       XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+               XtNwrongParameters,"cvtStringToBool",
+               XtCXtToolkitError,
+                 "String to Bool conversion needs no extra arguments",
+                  (String *)NULL, (Cardinal *)NULL);
+
+    if (   (CompareISOLatin1(str, "true") == 0)
+       || (CompareISOLatin1(str, "yes") == 0)
+       || (CompareISOLatin1(str, "on") == 0)
+       || (CompareISOLatin1(str, "1") == 0))   donestr( Bool, True, XtRBool );
+
+    if (   (CompareISOLatin1(str, "false") == 0)
+       || (CompareISOLatin1(str, "no") == 0)
+       || (CompareISOLatin1(str, "off") == 0)
+       || (CompareISOLatin1(str, "0") == 0))   donestr( Bool, False, XtRBool );
+
+    XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, XtRBool);
+    return False;
+}
+
+XtConvertArgRec const colorConvertArgs[] = {
+    {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.screen),
+     sizeof(Screen *)},
+    {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.colormap),
+     sizeof(Colormap)}
+};
+
+
+/* ARGSUSED */
+Boolean XtCvtIntToColor(
+    Display*   dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr        fromVal,
+    XrmValuePtr        toVal,
+    XtPointer  *closure_ret)
+{
+    XColor     c;
+    Screen     *screen;
+    Colormap   colormap;
+
+    if (*num_args != 2) {
+      XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+        XtNwrongParameters,"cvtIntOrPixelToXColor",XtCXtToolkitError,
+         "Pixel to color conversion needs screen and colormap arguments",
+          (String *)NULL, (Cardinal *)NULL);
+      return False;
+    }
+    screen = *((Screen **) args[0].addr);
+    colormap = *((Colormap *) args[1].addr);
+    c.pixel = *(int *)fromVal->addr;
+
+    XQueryColor(DisplayOfScreen(screen), colormap, &c);
+    done(XColor, c);
+}
+
+
+Boolean XtCvtStringToPixel(
+    Display*   dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr        fromVal,
+    XrmValuePtr        toVal,
+    XtPointer  *closure_ret)
+{
+    String         str = (String)fromVal->addr;
+    XColor         screenColor;
+    XColor         exactColor;
+    Screen         *screen;
+    XtPerDisplay    pd = _XtGetPerDisplay(dpy);
+    Colormap       colormap;
+    Status         status;
+    String          params[1];
+    Cardinal       num_params=1;
+
+    if (*num_args != 2) {
+     XtAppWarningMsg(pd->appContext, XtNwrongParameters, "cvtStringToPixel",
+                    XtCXtToolkitError,
+       "String to pixel conversion needs screen and colormap arguments",
+        (String *)NULL, (Cardinal *)NULL);
+     return False;
+    }
+
+    screen = *((Screen **) args[0].addr);
+    colormap = *((Colormap *) args[1].addr);
+
+    if (CompareISOLatin1(str, XtDefaultBackground) == 0) {
+       *closure_ret = NULL;
+       if (pd->rv) donestr(Pixel, BlackPixelOfScreen(screen), XtRPixel)
+       else        donestr(Pixel, WhitePixelOfScreen(screen), XtRPixel);
+    }
+    if (CompareISOLatin1(str, XtDefaultForeground) == 0) {
+       *closure_ret = NULL;
+       if (pd->rv) donestr(Pixel, WhitePixelOfScreen(screen), XtRPixel)
+        else       donestr(Pixel, BlackPixelOfScreen(screen), XtRPixel);
+    }
+
+    status = XAllocNamedColor(DisplayOfScreen(screen), colormap,
+                             (char*)str, &screenColor, &exactColor);
+    if (status == 0) {
+       String msg, type;
+       params[0] = str;
+       /* Server returns a specific error code but Xlib discards it.  Ugh */
+       if (XLookupColor(DisplayOfScreen(screen), colormap, (char*)str,
+                        &exactColor, &screenColor)) {
+           type = "noColormap";
+           msg = "Cannot allocate colormap entry for \"%s\"";
+       }
+       else {
+           type = "badValue";
+           msg = "Color name \"%s\" is not defined";
+       }
+
+       XtAppWarningMsg(pd->appContext, type, "cvtStringToPixel",
+                       XtCXtToolkitError, msg, params, &num_params);
+       *closure_ret = NULL;
+       return False;
+    } else {
+       *closure_ret = (char*)True;
+        donestr(Pixel, screenColor.pixel, XtRPixel);
+    }
+}
+
+/* ARGSUSED */
+static void FreePixel(
+    XtAppContext app,
+    XrmValuePtr        toVal,
+    XtPointer  closure,
+    XrmValuePtr        args,
+    Cardinal   *num_args)
+{
+    Screen         *screen;
+    Colormap       colormap;
+
+    if (*num_args != 2) {
+     XtAppWarningMsg(app, XtNwrongParameters,"freePixel",XtCXtToolkitError,
+       "Freeing a pixel requires screen and colormap arguments",
+        (String *)NULL, (Cardinal *)NULL);
+     return;
+    }
+
+    screen = *((Screen **) args[0].addr);
+    colormap = *((Colormap *) args[1].addr);
+
+    if (closure) {
+       XFreeColors( DisplayOfScreen(screen), colormap,
+                    (unsigned long*)toVal->addr, 1, (unsigned long)0
+                   );
+    }
+}
+
+
+/* no longer used by Xt, but it's in the spec */
+XtConvertArgRec const screenConvertArg[] = {
+    {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.screen),
+     sizeof(Screen *)}
+};
+
+/*ARGSUSED*/
+static void FetchDisplayArg(
+    Widget widget,
+    Cardinal *size,
+    XrmValue* value)
+{
+    if (widget == NULL)
+       XtErrorMsg("missingWidget", "fetchDisplayArg", XtCXtToolkitError,
+                  "FetchDisplayArg called without a widget to reference",
+                  (String*)NULL, (Cardinal*)NULL);
+        /* can't return any useful Display and caller will de-ref NULL,
+          so aborting is the only useful option */
+
+    value->size = sizeof(Display*);
+    value->addr = (XPointer)&DisplayOfScreen(XtScreenOfObject(widget));
+}
+
+static XtConvertArgRec const displayConvertArg[] = {
+    {XtProcedureArg, (XtPointer)FetchDisplayArg, 0},
+};
+
+/*ARGSUSED*/
+Boolean XtCvtStringToCursor(
+    Display*   dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr        fromVal,
+    XrmValuePtr        toVal,
+    XtPointer  *closure_ret)
+{
+    static const struct _CursorName {
+       const char      *name;
+       unsigned int    shape;
+    } cursor_names[] = {
+                       {"X_cursor",            XC_X_cursor},
+                       {"arrow",               XC_arrow},
+                       {"based_arrow_down",    XC_based_arrow_down},
+                       {"based_arrow_up",      XC_based_arrow_up},
+                       {"boat",                XC_boat},
+                       {"bogosity",            XC_bogosity},
+                       {"bottom_left_corner",  XC_bottom_left_corner},
+                       {"bottom_right_corner", XC_bottom_right_corner},
+                       {"bottom_side",         XC_bottom_side},
+                       {"bottom_tee",          XC_bottom_tee},
+                       {"box_spiral",          XC_box_spiral},
+                       {"center_ptr",          XC_center_ptr},
+                       {"circle",              XC_circle},
+                       {"clock",               XC_clock},
+                       {"coffee_mug",          XC_coffee_mug},
+                       {"cross",               XC_cross},
+                       {"cross_reverse",       XC_cross_reverse},
+                       {"crosshair",           XC_crosshair},
+                       {"diamond_cross",       XC_diamond_cross},
+                       {"dot",                 XC_dot},
+                       {"dotbox",              XC_dotbox},
+                       {"double_arrow",        XC_double_arrow},
+                       {"draft_large",         XC_draft_large},
+                       {"draft_small",         XC_draft_small},
+                       {"draped_box",          XC_draped_box},
+                       {"exchange",            XC_exchange},
+                       {"fleur",               XC_fleur},
+                       {"gobbler",             XC_gobbler},
+                       {"gumby",               XC_gumby},
+                       {"hand1",               XC_hand1},
+                       {"hand2",               XC_hand2},
+                       {"heart",               XC_heart},
+                       {"icon",                XC_icon},
+                       {"iron_cross",          XC_iron_cross},
+                       {"left_ptr",            XC_left_ptr},
+                       {"left_side",           XC_left_side},
+                       {"left_tee",            XC_left_tee},
+                       {"leftbutton",          XC_leftbutton},
+                       {"ll_angle",            XC_ll_angle},
+                       {"lr_angle",            XC_lr_angle},
+                       {"man",                 XC_man},
+                       {"middlebutton",        XC_middlebutton},
+                       {"mouse",               XC_mouse},
+                       {"pencil",              XC_pencil},
+                       {"pirate",              XC_pirate},
+                       {"plus",                XC_plus},
+                       {"question_arrow",      XC_question_arrow},
+                       {"right_ptr",           XC_right_ptr},
+                       {"right_side",          XC_right_side},
+                       {"right_tee",           XC_right_tee},
+                       {"rightbutton",         XC_rightbutton},
+                       {"rtl_logo",            XC_rtl_logo},
+                       {"sailboat",            XC_sailboat},
+                       {"sb_down_arrow",       XC_sb_down_arrow},
+                       {"sb_h_double_arrow",   XC_sb_h_double_arrow},
+                       {"sb_left_arrow",       XC_sb_left_arrow},
+                       {"sb_right_arrow",      XC_sb_right_arrow},
+                       {"sb_up_arrow",         XC_sb_up_arrow},
+                       {"sb_v_double_arrow",   XC_sb_v_double_arrow},
+                       {"shuttle",             XC_shuttle},
+                       {"sizing",              XC_sizing},
+                       {"spider",              XC_spider},
+                       {"spraycan",            XC_spraycan},
+                       {"star",                XC_star},
+                       {"target",              XC_target},
+                       {"tcross",              XC_tcross},
+                       {"top_left_arrow",      XC_top_left_arrow},
+                       {"top_left_corner",     XC_top_left_corner},
+                       {"top_right_corner",    XC_top_right_corner},
+                       {"top_side",            XC_top_side},
+                       {"top_tee",             XC_top_tee},
+                       {"trek",                XC_trek},
+                       {"ul_angle",            XC_ul_angle},
+                       {"umbrella",            XC_umbrella},
+                       {"ur_angle",            XC_ur_angle},
+                       {"watch",               XC_watch},
+                       {"xterm",               XC_xterm},
+    };
+    const struct _CursorName *nP;
+    char *name = (char *)fromVal->addr;
+    register Cardinal i;
+
+    if (*num_args != 1) {
+       XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+            XtNwrongParameters,"cvtStringToCursor",XtCXtToolkitError,
+             "String to cursor conversion needs display argument",
+              (String *)NULL, (Cardinal *)NULL);
+       return False;
+    }
+
+    for (i=0, nP=cursor_names; i < XtNumber(cursor_names); i++, nP++ ) {
+       if (strcmp(name, nP->name) == 0) {
+           Display *display = *(Display**)args[0].addr;
+           Cursor cursor = XCreateFontCursor(display, nP->shape );
+           donestr(Cursor, cursor, XtRCursor);
+       }
+    }
+    XtDisplayStringConversionWarning(dpy, name, XtRCursor);
+    return False;
+}
+
+/* ARGSUSED */
+static void FreeCursor(
+    XtAppContext app,
+    XrmValuePtr        toVal,
+    XtPointer  closure,        /* unused */
+    XrmValuePtr        args,
+    Cardinal   *num_args)
+{
+    Display*   display;
+
+    if (*num_args != 1) {
+     XtAppWarningMsg(app,
+            XtNwrongParameters,"freeCursor",XtCXtToolkitError,
+             "Free Cursor requires display argument",
+              (String *)NULL, (Cardinal *)NULL);
+     return;
+    }
+
+    display = *(Display**)args[0].addr;
+    XFreeCursor( display, *(Cursor*)toVal->addr );
+}
+
+/*ARGSUSED*/
+Boolean XtCvtStringToDisplay(
+    Display*   dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr        fromVal,
+    XrmValuePtr        toVal,
+    XtPointer  *closure_ret)
+{
+    Display    *d;
+
+    if (*num_args != 0)
+       XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+                 XtNwrongParameters,"cvtStringToDisplay",XtCXtToolkitError,
+                  "String to Display conversion needs no extra arguments",
+                   (String *)NULL, (Cardinal *)NULL);
+
+    d = XOpenDisplay((char *)fromVal->addr);
+    if (d != NULL)
+       donestr(Display*, d, XtRDisplay);
+
+    XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, XtRDisplay);
+    return False;
+}
+
+
+/*ARGSUSED*/
+Boolean XtCvtStringToFile(
+    Display*   dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr        fromVal,
+    XrmValuePtr        toVal,
+    XtPointer  *closure_ret)
+{
+    FILE *f;
+
+    if (*num_args != 0)
+       XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+                XtNwrongParameters,"cvtStringToFile",XtCXtToolkitError,
+                 "String to File conversion needs no extra arguments",
+                 (String *) NULL, (Cardinal *)NULL);
+
+    f = fopen((char *)fromVal->addr, "r");
+    if (f != NULL)
+       donestr(FILE*, f, XtRFile);
+
+    XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, XtRFile);
+    return False;
+}
+
+/* ARGSUSED */
+static void FreeFile(
+    XtAppContext app,
+    XrmValuePtr        toVal,
+    XtPointer  closure,        /* unused */
+    XrmValuePtr        args,           /* unused */
+    Cardinal   *num_args)
+{
+    if (*num_args != 0)
+       XtAppWarningMsg(app,
+                XtNwrongParameters,"freeFile",XtCXtToolkitError,
+                 "Free File requires no extra arguments",
+                 (String *) NULL, (Cardinal *)NULL);
+
+    fclose( *(FILE**)toVal->addr );
+}
+
+/*ARGSUSED*/
+Boolean XtCvtIntToFloat(
+    Display*   dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr        fromVal,
+    XrmValuePtr        toVal,
+    XtPointer  *closure_ret)
+{
+    if (*num_args != 0)
+       XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+                 XtNwrongParameters,"cvtIntToFloat",XtCXtToolkitError,
+                  "Integer to Float conversion needs no extra arguments",
+                   (String *)NULL, (Cardinal *)NULL);
+    done(float, (*(int *)fromVal->addr));
+}
+
+/*ARGSUSED*/
+Boolean XtCvtStringToFloat(
+    Display*   dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr        fromVal,
+    XrmValuePtr        toVal,
+    XtPointer  *closure_ret)
+{
+    int ret;
+    float f, nan;
+
+#ifndef ISC /* On ISC this generates a core dump :-( at least with gs */
+    /* depending on the system this may or may not do anything useful */
+    (void) sscanf ("NaNS", "%g",
+                  toVal->addr != NULL ? (float*) toVal->addr : &nan);
+#endif
+
+    if (*num_args != 0)
+       XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+                XtNwrongParameters,"cvtStringToFloat",XtCXtToolkitError,
+                 "String to Float conversion needs no extra arguments",
+                 (String *) NULL, (Cardinal *)NULL);
+
+    ret = sscanf (fromVal->addr, "%g", &f);
+    if (ret == 0) {
+       if (toVal->addr != NULL && toVal->size == sizeof nan)
+           *(float*)toVal->addr = nan;
+       XtDisplayStringConversionWarning (dpy, (char*) fromVal->addr, XtRFloat);
+       return False;
+    }
+    donestr(float, f, XtRFloat);
+}
+
+/*ARGSUSED*/
+Boolean XtCvtStringToFont(
+    Display*   dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr        fromVal,
+    XrmValuePtr        toVal,
+    XtPointer  *closure_ret)
+{
+    Font       f;
+    Display*   display;
+
+    if (*num_args != 1) {
+       XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+            XtNwrongParameters,"cvtStringToFont",XtCXtToolkitError,
+             "String to font conversion needs display argument",
+              (String *) NULL, (Cardinal *)NULL);
+       return False;
+    }
+
+    display = *(Display**)args[0].addr;
+
+    if (CompareISOLatin1((String)fromVal->addr, XtDefaultFont) != 0) {
+       f = XLoadFont(display, (char *)fromVal->addr);
+       if (f != 0) {
+  Done:            donestr( Font, f, XtRFont );
+       }
+       XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, XtRFont);
+    }
+    /* try and get the default font */
+
+    {
+       XrmName xrm_name[2];
+       XrmClass xrm_class[2];
+       XrmRepresentation rep_type;
+       XrmValue value;
+
+       xrm_name[0] = XrmPermStringToQuark ("xtDefaultFont");
+       xrm_name[1] = 0;
+       xrm_class[0] = XrmPermStringToQuark ("XtDefaultFont");
+       xrm_class[1] = 0;
+       if (XrmQGetResource(XtDatabase(display), xrm_name, xrm_class,
+                           &rep_type, &value)) {
+           if (rep_type == _XtQString) {
+               f = XLoadFont(display, (char *)value.addr);
+               if (f != 0)
+                   goto Done;
+               else
+                   XtDisplayStringConversionWarning(dpy, (char *)value.addr,
+                                                    XtRFont);
+           } else if (rep_type == XtQFont) {
+               f = *(Font*)value.addr;
+               goto Done;
+           } else if (rep_type == XtQFontStruct) {
+               f = ((XFontStruct*)value.addr)->fid;
+               goto Done;
+           }
+       }
+    }
+    /* Should really do XListFonts, but most servers support this */
+    f = XLoadFont(display, "-*-*-*-R-*-*-*-120-*-*-*-*-ISO8859-*");
+    if (f != 0)
+       goto Done;
+
+    XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+                   "noFont","cvtStringToFont",XtCXtToolkitError,
+                   "Unable to load any usable ISO8859 font",
+                   (String *) NULL, (Cardinal *)NULL);
+
+    return False;
+}
+
+/* ARGSUSED */
+static void FreeFont(
+    XtAppContext app,
+    XrmValuePtr        toVal,
+    XtPointer  closure,        /* unused */
+    XrmValuePtr        args,
+    Cardinal   *num_args)
+{
+    Display *display;
+    if (*num_args != 1) {
+       XtAppWarningMsg(app,
+            XtNwrongParameters,"freeFont",XtCXtToolkitError,
+             "Free Font needs display argument",
+              (String *) NULL, (Cardinal *)NULL);
+       return;
+    }
+
+    display = *(Display**)args[0].addr;
+    XUnloadFont( display, *(Font*)toVal->addr );
+}
+
+/*ARGSUSED*/
+Boolean XtCvtIntToFont(
+    Display*   dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr        fromVal,
+    XrmValuePtr        toVal,
+    XtPointer  *closure_ret)
+{
+    if (*num_args != 0)
+       XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+          XtNwrongParameters,"cvtIntToFont",XtCXtToolkitError,
+           "Integer to Font conversion needs no extra arguments",
+            (String *) NULL, (Cardinal *)NULL);
+    done(Font, *(int*)fromVal->addr);
+}
+
+/*ARGSUSED*/
+Boolean XtCvtStringToFontSet(
+    Display*    dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr fromVal,
+    XrmValuePtr toVal,
+    XtPointer   *closure_ret)
+{
+    XFontSet  f;
+    Display*  display;
+    char**    missing_charset_list;
+    int       missing_charset_count;
+    char*     def_string;
+
+    if (*num_args != 2) {
+      XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+           XtNwrongParameters,"cvtStringToFontSet",XtCXtToolkitError,
+             "String to FontSet conversion needs display and locale arguments",
+              (String *) NULL, (Cardinal *)NULL);
+      return False;
+    }
+
+    display = *(Display**)args[0].addr;
+
+    if (CompareISOLatin1((String)fromVal->addr, XtDefaultFontSet) != 0) {
+      f = XCreateFontSet(display, (char *)fromVal->addr,
+              &missing_charset_list, &missing_charset_count, &def_string);
+        /* Free any returned missing charset list */
+      if (missing_charset_count) {
+          XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+                 XtNmissingCharsetList,"cvtStringToFontSet",XtCXtToolkitError,
+                 "Missing charsets in String to FontSet conversion",
+                 (String *) NULL, (Cardinal *)NULL);
+            XFreeStringList(missing_charset_list);
+      }
+      if (f != NULL) {
+  Done:           donestr( XFontSet, f, XtRFontSet );
+      }
+      XtDisplayStringConversionWarning(dpy, (char *)fromVal->addr, XtRFontSet);
+    }
+    /* try and get the default fontset */
+
+    {
+      XrmName xrm_name[2];
+      XrmClass xrm_class[2];
+      XrmRepresentation rep_type;
+      XrmValue value;
+
+      xrm_name[0] = XrmPermStringToQuark ("xtDefaultFontSet");
+      xrm_name[1] = 0;
+      xrm_class[0] = XrmPermStringToQuark ("XtDefaultFontSet");
+      xrm_class[1] = 0;
+      if (XrmQGetResource(XtDatabase(display), xrm_name, xrm_class,
+                          &rep_type, &value)) {
+          if (rep_type == _XtQString) {
+
+              f = XCreateFontSet(display, (char *)value.addr,
+                                &missing_charset_list, &missing_charset_count,
+                                &def_string);
+                /* Free any returned missing charset list */
+              if (missing_charset_count) {
+                  XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+                        XtNmissingCharsetList,"cvtStringToFontSet",
+                        XtCXtToolkitError,
+                        "Missing charsets in String to FontSet conversion",
+                         (String *) NULL, (Cardinal *)NULL);
+                 XFreeStringList(missing_charset_list);
+              }
+              if (f != NULL)
+                  goto Done;
+              else
+                  XtDisplayStringConversionWarning(dpy, (char *)value.addr,
+                                                   XtRFontSet);
+          } else if (rep_type == XtQFontSet) {
+              f = *(XFontSet*)value.addr;
+              goto Done;
+          }
+      }
+  }
+
+    /* Should really do XListFonts, but most servers support this */
+    f = XCreateFontSet(display, "-*-*-*-R-*-*-*-120-*-*-*-*,*",
+          &missing_charset_list, &missing_charset_count, &def_string);
+
+    /* Free any returned missing charset list */
+    if (missing_charset_count) {
+      XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+             XtNmissingCharsetList,"cvtStringToFontSet",XtCXtToolkitError,
+             "Missing charsets in String to FontSet conversion",
+             (String *) NULL, (Cardinal *)NULL);
+        XFreeStringList(missing_charset_list);
+    }
+    if (f != NULL)
+      goto Done;
+
+    XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+           "noFont","cvtStringToFontSet",XtCXtToolkitError,
+             "Unable to load any usable fontset",
+              (String *) NULL, (Cardinal *)NULL);
+
+    return False;
+}
+
+/*ARGSUSED*/
+static void FreeFontSet(
+    XtAppContext       app,
+    XrmValuePtr                toVal,
+    XtPointer          closure,        /* unused */
+    XrmValuePtr                args,
+    Cardinal           *num_args)
+{
+    Display *display;
+    if (*num_args != 2) {
+      XtAppWarningMsg(app,
+           XtNwrongParameters,"freeFontSet",XtCXtToolkitError,
+             "FreeFontSet needs display and locale arguments",
+              (String *) NULL, (Cardinal *)NULL);
+      return;
+    }
+
+    display = *(Display**)args[0].addr;
+    XFreeFontSet( display, *(XFontSet*)toVal->addr );
+}
+
+/*ARGSUSED*/
+static void FetchLocaleArg(
+    Widget widget,     /* unused */
+    Cardinal *size,    /* unused */
+    XrmValue *value)
+{
+    static XrmString locale;
+
+    locale = XrmQuarkToString(XrmStringToQuark
+                             (setlocale(LC_CTYPE, (char*)NULL)));
+    value->size = sizeof(XrmString);
+    value->addr = (XPointer)&locale;
+}
+
+static XtConvertArgRec const localeDisplayConvertArgs[] = {
+    {XtProcedureArg, (XtPointer)FetchDisplayArg, 0},
+    {XtProcedureArg, (XtPointer)FetchLocaleArg, 0},
+};
+
+
+/*ARGSUSED*/
+Boolean
+XtCvtStringToFontStruct(
+    Display*   dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr        fromVal,
+    XrmValuePtr        toVal,
+    XtPointer  *closure_ret)
+{
+    XFontStruct            *f;
+    Display*   display;
+
+    if (*num_args != 1) {
+     XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+            XtNwrongParameters,"cvtStringToFontStruct",XtCXtToolkitError,
+             "String to font conversion needs display argument",
+              (String *) NULL, (Cardinal *)NULL);
+     return False;
+    }
+
+    display = *(Display**)args[0].addr;
+
+    if (CompareISOLatin1((String)fromVal->addr, XtDefaultFont) != 0) {
+       f = XLoadQueryFont(display, (char *)fromVal->addr);
+       if (f != NULL) {
+  Done:            donestr( XFontStruct*, f, XtRFontStruct);
+       }
+
+       XtDisplayStringConversionWarning(dpy, (char*)fromVal->addr,
+                                        XtRFontStruct);
+    }
+
+    /* try and get the default font */
+
+    {
+       XrmName xrm_name[2];
+       XrmClass xrm_class[2];
+       XrmRepresentation rep_type;
+       XrmValue value;
+
+       xrm_name[0] = XrmPermStringToQuark ("xtDefaultFont");
+       xrm_name[1] = 0;
+       xrm_class[0] = XrmPermStringToQuark ("XtDefaultFont");
+       xrm_class[1] = 0;
+       if (XrmQGetResource(XtDatabase(display), xrm_name, xrm_class,
+                           &rep_type, &value)) {
+           if (rep_type == _XtQString) {
+               f = XLoadQueryFont(display, (char*)value.addr);
+               if (f != NULL)
+                   goto Done;
+               else
+                   XtDisplayStringConversionWarning(dpy, (char*)value.addr,
+                                                    XtRFontStruct);
+           } else if (rep_type == XtQFont) {
+               f = XQueryFont(display, *(Font*)value.addr );
+               if (f != NULL) goto Done;
+           } else if (rep_type == XtQFontStruct) {
+               f = (XFontStruct*)value.addr;
+               goto Done;
+           }
+       }
+    }
+    /* Should really do XListFonts, but most servers support this */
+    f = XLoadQueryFont(display, "-*-*-*-R-*-*-*-120-*-*-*-*-ISO8859-*");
+    if (f != NULL)
+       goto Done;
+
+    XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+            "noFont","cvtStringToFontStruct",XtCXtToolkitError,
+             "Unable to load any usable ISO8859 font",
+              (String *) NULL, (Cardinal *)NULL);
+
+    return False;
+}
+
+/* ARGSUSED */
+static void FreeFontStruct(
+    XtAppContext app,
+    XrmValuePtr        toVal,
+    XtPointer  closure,        /* unused */
+    XrmValuePtr        args,
+    Cardinal   *num_args)
+{
+    Display *display;
+    if (*num_args != 1) {
+     XtAppWarningMsg(app,
+            XtNwrongParameters,"freeFontStruct",XtCXtToolkitError,
+             "Free FontStruct requires display argument",
+              (String *) NULL, (Cardinal *)NULL);
+     return;
+    }
+
+    display = *(Display**)args[0].addr;
+    XFreeFont( display, *(XFontStruct**)toVal->addr );
+}
+
+/*ARGSUSED*/
+Boolean XtCvtStringToInt(
+    Display*   dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr        fromVal,
+    XrmValuePtr        toVal,
+    XtPointer  *closure_ret)
+{
+    int        i;
+
+    if (*num_args != 0)
+       XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+                 XtNwrongParameters,"cvtStringToInt",XtCXtToolkitError,
+                  "String to Integer conversion needs no extra arguments",
+                  (String *) NULL, (Cardinal *)NULL);
+    if (IsInteger((String)fromVal->addr, &i))
+       donestr(int, i, XtRInt);
+
+    XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, XtRInt);
+    return False;
+}
+
+/*ARGSUSED*/
+Boolean XtCvtStringToShort(
+    Display*   dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr fromVal,
+    XrmValuePtr toVal,
+    XtPointer  *closure_ret)
+{
+    int i;
+
+    if (*num_args != 0)
+        XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+         XtNwrongParameters,"cvtStringToShort",XtCXtToolkitError,
+          "String to Integer conversion needs no extra arguments",
+           (String *) NULL, (Cardinal *)NULL);
+    if (IsInteger((String)fromVal->addr, &i))
+        donestr(short, (short)i, XtRShort);
+
+    XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, XtRShort);
+    return False;
+}
+
+/*ARGSUSED*/
+Boolean XtCvtStringToDimension(
+    Display*   dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr fromVal,
+    XrmValuePtr toVal,
+    XtPointer  *closure_ret)
+{
+    int i;
+
+    if (*num_args != 0)
+        XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+         XtNwrongParameters,"cvtStringToDimension",XtCXtToolkitError,
+          "String to Dimension conversion needs no extra arguments",
+           (String *) NULL, (Cardinal *)NULL);
+    if (IsInteger((String)fromVal->addr, &i)) {
+        if ( i < 0 )
+            XtDisplayStringConversionWarning(dpy, (char*)fromVal->addr,
+                                            XtRDimension);
+        donestr(Dimension, (Dimension)i, XtRDimension);
+    }
+    XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, XtRDimension);
+    return False;
+}
+
+/*ARGSUSED*/
+Boolean XtCvtIntToUnsignedChar(
+    Display*   dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr        fromVal,
+    XrmValuePtr        toVal,
+    XtPointer  *closure_ret)
+{
+    if (*num_args != 0)
+       XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+                 XtNwrongParameters,"cvtIntToUnsignedChar",XtCXtToolkitError,
+                  "Integer to UnsignedChar conversion needs no extra arguments",
+                   (String *)NULL, (Cardinal *)NULL);
+    done(unsigned char, (*(int *)fromVal->addr));
+}
+
+
+/*ARGSUSED*/
+Boolean XtCvtStringToUnsignedChar(
+    Display*   dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr fromVal,
+    XrmValuePtr toVal,
+    XtPointer  *closure_ret)
+{
+    int i;
+
+    if (*num_args != 0)
+        XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+                 XtNwrongParameters,"cvtStringToUnsignedChar",XtCXtToolkitError,
+                  "String to Integer conversion needs no extra arguments",
+                   (String *) NULL, (Cardinal *)NULL);
+    if (IsInteger((String)fromVal->addr, &i)) {
+        if ( i < 0 || i > 255 )
+            XtDisplayStringConversionWarning(dpy, (char*)fromVal->addr,
+                                            XtRUnsignedChar);
+        donestr(unsigned char, i, XtRUnsignedChar);
+    }
+    XtDisplayStringConversionWarning(dpy, (char*)fromVal->addr,
+                                    XtRUnsignedChar);
+    return False;
+}
+
+
+/*ARGSUSED*/
+Boolean XtCvtColorToPixel(
+    Display*   dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr        fromVal,
+    XrmValuePtr        toVal,
+    XtPointer  *closure_ret)
+{
+    if (*num_args != 0)
+       XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+                 XtNwrongParameters,"cvtXColorToPixel",XtCXtToolkitError,
+                  "Color to Pixel conversion needs no extra arguments",
+                   (String *) NULL, (Cardinal *)NULL);
+    done(Pixel, ((XColor *)fromVal->addr)->pixel);
+}
+
+/*ARGSUSED*/
+Boolean XtCvtIntToPixel(
+    Display*   dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr        fromVal,
+    XrmValuePtr        toVal,
+    XtPointer  *closure_ret)
+{
+    if (*num_args != 0)
+       XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+                 XtNwrongParameters,"cvtIntToPixel",XtCXtToolkitError,
+                  "Integer to Pixel conversion needs no extra arguments",
+                   (String *) NULL, (Cardinal *)NULL);
+    done(Pixel, *(int*)fromVal->addr);
+}
+
+/*ARGSUSED*/
+Boolean XtCvtIntToPixmap(
+    Display*   dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr fromVal,
+    XrmValuePtr toVal,
+    XtPointer  *closure_ret)
+{
+    if (*num_args != 0)
+        XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+                 XtNwrongParameters,"cvtIntToPixmap",XtCXtToolkitError,
+                  "Integer to Pixmap conversion needs no extra arguments",
+                   (String *) NULL, (Cardinal *)NULL);
+    done(Pixmap, *(int*)fromVal->addr);
+}
+
+#ifdef MOTIFBC
+void LowerCase(register char  *source, register *dest)
+{
+    register char ch;
+    int i;
+
+    for (i = 0; (ch = *source) != 0 && i < 999; source++, dest++, i++) {
+       if ('A' <= ch && ch <= 'Z')
+           *dest = ch - 'A' + 'a';
+       else
+           *dest = ch;
+    }
+    *dest = 0;
+}
+#endif
+
+static int CompareISOLatin1 (const char *first, const char *second)
+{
+    register const unsigned char *ap, *bp;
+
+    for (ap = (const unsigned char *) first,
+        bp = (const unsigned char *) second;
+        *ap && *bp; ap++, bp++) {
+       register unsigned char a, b;
+
+       if ((a = *ap) != (b = *bp)) {
+           /* try lowercasing and try again */
+
+           if ((a >= XK_A) && (a <= XK_Z))
+             a += (XK_a - XK_A);
+           else if ((a >= XK_Agrave) && (a <= XK_Odiaeresis))
+             a += (XK_agrave - XK_Agrave);
+           else if ((a >= XK_Ooblique) && (a <= XK_Thorn))
+             a += (XK_oslash - XK_Ooblique);
+
+           if ((b >= XK_A) && (b <= XK_Z))
+             b += (XK_a - XK_A);
+           else if ((b >= XK_Agrave) && (b <= XK_Odiaeresis))
+             b += (XK_agrave - XK_Agrave);
+           else if ((b >= XK_Ooblique) && (b <= XK_Thorn))
+             b += (XK_oslash - XK_Ooblique);
+
+           if (a != b) break;
+       }
+    }
+    return (((int) *bp) - ((int) *ap));
+}
+
+static void CopyISOLatin1Lowered(char *dst, const char *src)
+{
+    unsigned char *dest = (unsigned char *) dst;
+    const unsigned char *source = (const unsigned char *) src;
+
+    for ( ; *source; source++, dest++) {
+       if (*source >= XK_A  && *source <= XK_Z)
+           *dest = *source + (XK_a - XK_A);
+       else if (*source >= XK_Agrave && *source <= XK_Odiaeresis)
+           *dest = *source + (XK_agrave - XK_Agrave);
+       else if (*source >= XK_Ooblique && *source <= XK_Thorn)
+           *dest = *source + (XK_oslash - XK_Ooblique);
+       else
+           *dest = *source;
+    }
+    *dest = '\0';
+}
+
+/*ARGSUSED*/
+Boolean
+XtCvtStringToInitialState(
+    Display*   dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr        fromVal,
+    XrmValuePtr        toVal,
+    XtPointer  *closure_ret)
+{
+    String str = (String)fromVal->addr;
+    if (*num_args != 0)
+       XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+                 XtNwrongParameters,"cvtStringToInitialState",XtCXtToolkitError,
+                  "String to InitialState conversion needs no extra arguments",
+                   (String *) NULL, (Cardinal *)NULL);
+
+    if (CompareISOLatin1(str, "NormalState") == 0) donestr(int, NormalState, XtRInitialState);
+    if (CompareISOLatin1(str, "IconicState") == 0) donestr(int, IconicState, XtRInitialState);
+    {
+       int val;
+       if (IsInteger(str, &val)) donestr( int, val, XtRInitialState );
+    }
+    XtDisplayStringConversionWarning(dpy, str, XtRInitialState);
+    return False;
+}
+
+static XtConvertArgRec const visualConvertArgs[] = {
+    {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.screen),
+     sizeof(Screen *)},
+    {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.depth),
+     sizeof(Cardinal)}
+};
+
+/*ARGSUSED*/
+Boolean XtCvtStringToVisual(
+    Display*   dpy,
+    XrmValuePtr args,          /* Screen, depth */
+    Cardinal    *num_args,     /* 2 */
+    XrmValuePtr        fromVal,
+    XrmValuePtr        toVal,
+    XtPointer  *closure_ret)   /* unused */
+{
+    String str = (String)fromVal->addr;
+    int vc;
+    XVisualInfo vinfo;
+    if (*num_args != 2) {
+       XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+                 XtNwrongParameters,"cvtStringToVisual",XtCXtToolkitError,
+                  "String to Visual conversion needs screen and depth arguments",
+                   (String *) NULL, (Cardinal *)NULL);
+       return False;
+    }
+
+         if (CompareISOLatin1(str, "StaticGray") == 0) vc = StaticGray;
+    else if (CompareISOLatin1(str, "StaticColor") == 0)        vc = StaticColor;
+    else if (CompareISOLatin1(str, "TrueColor") == 0)  vc = TrueColor;
+    else if (CompareISOLatin1(str, "GrayScale") == 0)  vc = GrayScale;
+    else if (CompareISOLatin1(str, "PseudoColor") == 0)        vc = PseudoColor;
+    else if (CompareISOLatin1(str, "DirectColor") == 0)        vc = DirectColor;
+    else if (!IsInteger(str, &vc)) {
+       XtDisplayStringConversionWarning(dpy, str, "Visual class name");
+       return False;
+    }
+
+    if (XMatchVisualInfo( XDisplayOfScreen((Screen*)*(Screen**)args[0].addr),
+                    XScreenNumberOfScreen((Screen*)*(Screen**)args[0].addr),
+                    (int)*(int*)args[1].addr,
+                    vc,
+                    &vinfo) ) {
+       donestr( Visual*, vinfo.visual, XtRVisual );
+    }
+    else {
+       String params[2];
+       Cardinal num_params = 2;
+       params[0] = str;
+       params[1] =
+           DisplayString(XDisplayOfScreen((Screen*)*(Screen**)args[0].addr));
+       XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+                 XtNconversionError, "stringToVisual", XtCXtToolkitError,
+                  "Cannot find Visual of class %s for display %s",
+                 params, &num_params );
+       return False;
+    }
+}
+
+
+/*ARGSUSED*/
+Boolean XtCvtStringToAtom(
+    Display*   dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr        fromVal,
+    XrmValuePtr        toVal,
+    XtPointer  *closure_ret)
+{
+    Atom atom;
+    if (*num_args != 1) {
+       XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+                 XtNwrongParameters,"cvtStringToAtom",XtCXtToolkitError,
+                  "String to Atom conversion needs Display argument",
+                   (String *) NULL, (Cardinal *)NULL);
+       return False;
+    }
+
+    atom =  XInternAtom( *(Display**)args->addr, (char*)fromVal->addr, False );
+    donestr(Atom, atom, XtRAtom);
+}
+
+/*ARGSUSED*/
+Boolean XtCvtStringToDirectoryString(
+    Display    *dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr fromVal,
+    XrmValuePtr toVal,
+    XtPointer  *closure_ret)
+{
+    String str;
+    char directory[PATH_MAX+1];
+
+    if (*num_args != 0)
+       XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+           XtNwrongParameters,"cvtStringToDirectoryString",XtCXtToolkitError,
+           "String to DirectoryString conversion needs no extra arguments",
+           (String *)NULL, (Cardinal *)NULL);
+
+    str = (String)fromVal->addr;
+    if (CompareISOLatin1(str, "XtCurrentDirectory") == 0) {
+       /* uglier, but does not depend on compiler knowing return type */
+#if !defined(X_NOT_POSIX) || defined(SYSV) || defined(WIN32)
+       if (getcwd(directory, PATH_MAX + 1))
+           str = directory;
+#else
+       if (getwd(directory))
+           str = directory;
+#endif
+       if (!str) {
+           if (errno == EACCES)
+               errno = 0;          /* reset errno */
+           XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr,
+                                            XtRDirectoryString);
+           return False;
+       }
+    }
+
+    /* Since memory from the resource database or from static buffers of
+     * system libraries may be freed or overwritten, allocate memory.
+     * The memory is freed when all cache references are released.
+     */
+    str = XtNewString(str);
+    donestr(String, str, XtRDirectoryString);
+}
+
+/*ARGSUSED*/
+static void FreeDirectoryString(
+    XtAppContext app,
+    XrmValuePtr        toVal,
+    XtPointer  closure,        /* unused */
+    XrmValuePtr        args,
+    Cardinal   *num_args)
+{
+    if (*num_args != 0)
+       XtAppWarningMsg(app,
+                XtNwrongParameters,"freeDirectoryString",XtCXtToolkitError,
+                "Free Directory String requires no extra arguments",
+                 (String *) NULL, (Cardinal *) NULL);
+
+    XtFree((char *) toVal->addr);
+}
+
+/*ARGSUSED*/
+Boolean XtCvtStringToRestartStyle(
+    Display    *dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr fromVal,
+    XrmValuePtr toVal,
+    XtPointer  *closure_ret)
+{
+    String str = (String)fromVal->addr;
+    if (*num_args != 0)
+       XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+             XtNwrongParameters,"cvtStringToRestartStyle",XtCXtToolkitError,
+              "String to RestartStyle conversion needs no extra arguments",
+              (String *)NULL, (Cardinal *)NULL);
+
+    if (CompareISOLatin1(str, "RestartIfRunning") == 0)
+       donestr(unsigned char, SmRestartIfRunning, XtRRestartStyle);
+    if (CompareISOLatin1(str, "RestartAnyway") == 0)
+       donestr(unsigned char, SmRestartAnyway, XtRRestartStyle);
+    if (CompareISOLatin1(str, "RestartImmediately") == 0)
+       donestr(unsigned char, SmRestartImmediately, XtRRestartStyle);
+    if (CompareISOLatin1(str, "RestartNever") == 0)
+       donestr(unsigned char, SmRestartNever, XtRRestartStyle);
+    XtDisplayStringConversionWarning(dpy, str, XtRRestartStyle);
+    return False;
+}
+
+/*ARGSUSED*/
+Boolean XtCvtStringToCommandArgArray(
+    Display    *dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr fromVal,
+    XrmValuePtr toVal,
+    XtPointer  *closure_ret)
+{
+    String *strarray, *ptr;
+    char *src;
+    char *dst, *dst_str;
+    char *start;
+    int tokens, len;
+
+    if (*num_args != 0)
+       XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+            XtNwrongParameters,"cvtStringToCommandArgArray",XtCXtToolkitError,
+            "String to CommandArgArray conversion needs no extra arguments",
+            (String *)NULL, (Cardinal *)NULL);
+
+    src = fromVal->addr;
+    dst = dst_str = __XtMalloc((unsigned) strlen(src) + 1);
+    tokens = 0;
+
+    while (*src != '\0') {
+       /* skip whitespace */
+       while (IsWhitespace(*src) || IsNewline(*src))
+           src++;
+       /* test for end of string */
+       if (*src == '\0')
+           break;
+
+       /* start new token */
+       tokens++;
+       start = src;
+       while (*src != '\0' && !IsWhitespace(*src) && !IsNewline(*src)) {
+           if (*src == '\\' &&
+               (IsWhitespace(*(src+1)) || IsNewline(*(src+1)))) {
+               len = src - start;
+               if (len) {
+                   /* copy preceeding part of token */
+                   memcpy(dst, start, len);
+                   dst += len;
+               }
+               /* skip backslash */
+               src++;
+               /* next part of token starts at whitespace */
+               start = src;
+           }
+           src++;
+       }
+       len = src - start;
+       if (len) {
+           /* copy last part of token */
+           memcpy(dst, start, len);
+           dst += len;
+       }
+       *dst = '\0';
+       if (*src != '\0')
+           dst++;
+    }
+
+    ptr = strarray = (String*) __XtMalloc((Cardinal)(tokens+1) * sizeof(String));
+    src = dst_str;
+    while (--tokens >= 0) {
+       *ptr = src;
+       ptr++;
+       if (tokens) {
+           len = strlen(src);
+           src = src + len + 1;
+       }
+    }
+    *ptr = NULL;
+
+    *closure_ret = (XtPointer) strarray;
+    donestr(char**, strarray, XtRCommandArgArray)
+}
+
+/*ARGSUSED*/
+static void ArgArrayDestructor(
+    XtAppContext app,
+    XrmValuePtr        toVal,
+    XtPointer  closure,
+    XrmValuePtr        args,
+    Cardinal   *num_args)
+{
+    String *strarray;
+
+    if (closure) {
+       strarray = (String*) closure;
+       XtFree(*strarray);
+       XtFree((char *) strarray);
+    }
+}
+
+/*ARGSUSED*/
+Boolean XtCvtStringToGravity (
+    Display* dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr fromVal,
+    XrmValuePtr toVal,
+    XtPointer  *closure_ret)
+{
+    static struct _namepair {
+       XrmQuark quark;
+       const char *name;
+       int gravity;
+    } names[] = {
+       { NULLQUARK, "forget",          ForgetGravity },
+       { NULLQUARK, "northwest",       NorthWestGravity },
+       { NULLQUARK, "north",           NorthGravity },
+       { NULLQUARK, "northeast",       NorthEastGravity },
+       { NULLQUARK, "west",            WestGravity },
+       { NULLQUARK, "center",          CenterGravity },
+       { NULLQUARK, "east",            EastGravity },
+       { NULLQUARK, "southwest",       SouthWestGravity },
+       { NULLQUARK, "south",           SouthGravity },
+       { NULLQUARK, "southeast",       SouthEastGravity },
+       { NULLQUARK, "static",          StaticGravity },
+       { NULLQUARK, "unmap",           UnmapGravity },
+       { NULLQUARK, "0",               ForgetGravity },
+       { NULLQUARK, "1",               NorthWestGravity },
+       { NULLQUARK, "2",               NorthGravity },
+       { NULLQUARK, "3",               NorthEastGravity },
+       { NULLQUARK, "4",               WestGravity },
+       { NULLQUARK, "5",               CenterGravity },
+       { NULLQUARK, "6",               EastGravity },
+       { NULLQUARK, "7",               SouthWestGravity },
+       { NULLQUARK, "8",               SouthGravity },
+       { NULLQUARK, "9",               SouthEastGravity },
+       { NULLQUARK, "10",              StaticGravity },
+       { NULLQUARK, NULL,              ForgetGravity }
+    };
+    static Boolean haveQuarks = FALSE;
+    char lowerName[40];
+    XrmQuark q;
+    char *s;
+    struct _namepair *np;
+
+    if (*num_args != 0) {
+        XtAppWarningMsg(XtDisplayToApplicationContext (dpy),
+                       "wrongParameters","cvtStringToGravity","XtToolkitError",
+                       "String to Gravity conversion needs no extra arguments",
+                       (String *) NULL, (Cardinal *)NULL);
+       return False;
+    }
+    if (!haveQuarks) {
+       for (np = names; np->name; np++) {
+           np->quark = XrmPermStringToQuark (np->name);
+       }
+       haveQuarks = TRUE;
+    }
+    s = (char *) fromVal->addr;
+    if (strlen(s) < sizeof lowerName) {
+       CopyISOLatin1Lowered (lowerName, s);
+       q = XrmStringToQuark (lowerName);
+       for (np = names; np->name; np++)
+           if (np->quark == q) donestr(int, np->gravity, XtRGravity);
+    }
+    XtDisplayStringConversionWarning(dpy, (char *)fromVal->addr, XtRGravity);
+    return False;
+}
+
+void _XtAddDefaultConverters(
+    ConverterTable table)
+{
+#define Add(from, to, proc, convert_args, num_args, cache) \
+    _XtTableAddConverter(table, from, to, proc, \
+           (XtConvertArgList) convert_args, (Cardinal)num_args, \
+           True, cache, (XtDestructor)NULL, True)
+
+#define Add2(from, to, proc, convert_args, num_args, cache, destructor) \
+    _XtTableAddConverter(table, from, to, proc, \
+           (XtConvertArgList) convert_args, (Cardinal)num_args, \
+           True, cache, destructor, True)
+
+    Add(XtQColor, XtQPixel,       XtCvtColorToPixel,   NULL, 0, XtCacheNone);
+
+    Add(XtQInt,   XtQBool,       XtCvtIntToBool,      NULL, 0, XtCacheNone);
+    Add(XtQInt,   XtQBoolean,     XtCvtIntToBoolean,   NULL, 0, XtCacheNone);
+    Add(XtQInt,   XtQColor,      XtCvtIntToColor,
+       colorConvertArgs, XtNumber(colorConvertArgs), XtCacheByDisplay);
+    Add(XtQInt,   XtQDimension,   XtCvtIntToShort,     NULL, 0, XtCacheNone);
+    Add(XtQInt,   XtQFloat,       XtCvtIntToFloat,     NULL, 0, XtCacheNone);
+    Add(XtQInt,   XtQFont,        XtCvtIntToFont,      NULL, 0, XtCacheNone);
+    Add(XtQInt,   XtQPixel,       XtCvtIntToPixel,     NULL, 0, XtCacheNone);
+    Add(XtQInt,   XtQPixmap,      XtCvtIntToPixmap,    NULL, 0, XtCacheNone);
+    Add(XtQInt,   XtQPosition,    XtCvtIntToShort,     NULL, 0, XtCacheNone);
+    Add(XtQInt,   XtQShort,       XtCvtIntToShort,     NULL, 0, XtCacheNone);
+    Add(XtQInt,   XtQUnsignedChar,XtCvtIntToUnsignedChar,NULL, 0, XtCacheNone);
+
+    Add(XtQPixel, XtQColor,      XtCvtIntToColor,
+       colorConvertArgs, XtNumber(colorConvertArgs), XtCacheByDisplay);
+
+    Add(_XtQString, XtQAtom,      XtCvtStringToAtom,
+       displayConvertArg, XtNumber(displayConvertArg), XtCacheNone);
+    Add(_XtQString, XtQBool,      XtCvtStringToBool,    NULL, 0, XtCacheNone);
+    Add(_XtQString, XtQBoolean,   XtCvtStringToBoolean, NULL, 0, XtCacheNone);
+   Add2(_XtQString, XtQCommandArgArray,  XtCvtStringToCommandArgArray,
+       NULL, 0, XtCacheNone | XtCacheRefCount, ArgArrayDestructor);
+   Add2(_XtQString, XtQCursor,    XtCvtStringToCursor,
+       displayConvertArg, XtNumber(displayConvertArg),
+       XtCacheByDisplay, FreeCursor);
+    Add(_XtQString, XtQDimension, XtCvtStringToDimension,NULL, 0, XtCacheNone);
+   Add2(_XtQString, XtQDirectoryString, XtCvtStringToDirectoryString, NULL, 0,
+       XtCacheNone | XtCacheRefCount, FreeDirectoryString);
+    Add(_XtQString, XtQDisplay,   XtCvtStringToDisplay, NULL, 0, XtCacheAll);
+   Add2(_XtQString, XtQFile,      XtCvtStringToFile,    NULL, 0,
+       XtCacheAll | XtCacheRefCount, FreeFile);
+    Add(_XtQString, XtQFloat,     XtCvtStringToFloat,   NULL, 0, XtCacheNone);
+
+   Add2(_XtQString, XtQFont,      XtCvtStringToFont,
+       displayConvertArg, XtNumber(displayConvertArg),
+       XtCacheByDisplay, FreeFont);
+   Add2(_XtQString, XtQFontSet,   XtCvtStringToFontSet,
+       localeDisplayConvertArgs, XtNumber(localeDisplayConvertArgs),
+       XtCacheByDisplay, FreeFontSet);
+   Add2(_XtQString, XtQFontStruct,XtCvtStringToFontStruct,
+       displayConvertArg, XtNumber(displayConvertArg),
+       XtCacheByDisplay, FreeFontStruct);
+
+    Add(_XtQString, XtQGravity,   XtCvtStringToGravity, NULL, 0, XtCacheNone);
+    Add(_XtQString, XtQInitialState, XtCvtStringToInitialState, NULL, 0,
+       XtCacheNone);
+    Add(_XtQString, XtQInt,         XtCvtStringToInt,    NULL, 0, XtCacheAll);
+   Add2(_XtQString, XtQPixel,        XtCvtStringToPixel,
+       colorConvertArgs, XtNumber(colorConvertArgs),
+       XtCacheByDisplay, FreePixel);
+    Add(_XtQString, XtQPosition,     XtCvtStringToShort,  NULL, 0, XtCacheAll);
+    Add(_XtQString, XtQRestartStyle, XtCvtStringToRestartStyle, NULL, 0,
+       XtCacheNone);
+    Add(_XtQString, XtQShort,        XtCvtStringToShort,  NULL, 0, XtCacheAll);
+    Add(_XtQString, XtQUnsignedChar, XtCvtStringToUnsignedChar,
+       NULL, 0, XtCacheAll);
+   Add2(_XtQString, XtQVisual,       XtCvtStringToVisual,
+       visualConvertArgs, XtNumber(visualConvertArgs),
+       XtCacheByDisplay, NULL);
+
+   _XtAddTMConverters(table);
+}
diff --git a/src/Core.c b/src/Core.c
new file mode 100644 (file)
index 0000000..d61f43e
--- /dev/null
@@ -0,0 +1,407 @@
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicP.h"
+#include "EventI.h"
+#include "ConvertI.h"
+#include "TranslateI.h"
+#include "ResourceI.h"
+#include "RectObj.h"
+#include "RectObjP.h"
+#include "ThreadsI.h"
+#include "StringDefs.h"
+
+/******************************************************************
+ *
+ * CoreWidget Resources
+ *
+ ******************************************************************/
+
+externaldef(xtinherittranslations) int _XtInheritTranslations = 0;
+extern String XtCXtToolkitError; /* from IntrinsicI.h */
+static void XtCopyScreen(Widget, int, XrmValue *);
+
+static XtResource resources[] = {
+    {XtNscreen, XtCScreen, XtRScreen, sizeof(Screen*),
+      XtOffsetOf(CoreRec,core.screen), XtRCallProc, (XtPointer)XtCopyScreen},
+/*_XtCopyFromParent does not work for screen because the Display
+parameter is not passed through to the XtRCallProc routines */
+    {XtNdepth, XtCDepth, XtRInt,sizeof(int),
+         XtOffsetOf(CoreRec,core.depth),
+        XtRCallProc, (XtPointer)_XtCopyFromParent},
+    {XtNcolormap, XtCColormap, XtRColormap, sizeof(Colormap),
+        XtOffsetOf(CoreRec,core.colormap),
+        XtRCallProc,(XtPointer)_XtCopyFromParent},
+    {XtNbackground, XtCBackground, XtRPixel,sizeof(Pixel),
+         XtOffsetOf(CoreRec,core.background_pixel),
+        XtRString, (XtPointer)"XtDefaultBackground"},
+    {XtNbackgroundPixmap, XtCPixmap, XtRPixmap, sizeof(Pixmap),
+         XtOffsetOf(CoreRec,core.background_pixmap),
+        XtRImmediate, (XtPointer)XtUnspecifiedPixmap},
+    {XtNborderColor, XtCBorderColor, XtRPixel,sizeof(Pixel),
+         XtOffsetOf(CoreRec,core.border_pixel),
+         XtRString,(XtPointer)"XtDefaultForeground"},
+    {XtNborderPixmap, XtCPixmap, XtRPixmap, sizeof(Pixmap),
+         XtOffsetOf(CoreRec,core.border_pixmap),
+        XtRImmediate, (XtPointer)XtUnspecifiedPixmap},
+    {XtNmappedWhenManaged, XtCMappedWhenManaged, XtRBoolean, sizeof(Boolean),
+         XtOffsetOf(CoreRec,core.mapped_when_managed),
+        XtRImmediate, (XtPointer)True},
+    {XtNtranslations, XtCTranslations, XtRTranslationTable,
+        sizeof(XtTranslations), XtOffsetOf(CoreRec,core.tm.translations),
+        XtRTranslationTable, (XtPointer)NULL},
+    {XtNaccelerators, XtCAccelerators, XtRAcceleratorTable,
+        sizeof(XtTranslations), XtOffsetOf(CoreRec,core.accelerators),
+        XtRTranslationTable, (XtPointer)NULL}
+    };
+
+static void CoreInitialize(Widget, Widget, ArgList, Cardinal *);
+static void CoreClassPartInitialize(WidgetClass);
+static void CoreDestroy(Widget);
+static void CoreRealize(Widget, XtValueMask *, XSetWindowAttributes *);
+static Boolean CoreSetValues(Widget, Widget, Widget, ArgList, Cardinal *);
+static void CoreSetValuesAlmost(Widget, Widget, XtWidgetGeometry *, XtWidgetGeometry *);
+
+static RectObjClassRec unNamedObjClassRec = {
+  {
+    /* superclass        */    (WidgetClass)&rectObjClassRec,
+    /* class_name        */    "UnNamedObj",
+    /* widget_size       */    0,
+    /* class_initialize   */    NULL,
+    /* class_part_initialize*/ NULL,
+    /* class_inited       */   FALSE,
+    /* initialize        */    NULL,
+    /* initialize_hook    */   NULL,
+    /* realize           */    (XtProc)XtInheritRealize,
+    /* actions           */    NULL,
+    /* num_actions       */    0,
+    /* resources         */    NULL,
+    /* num_resources     */    0,
+    /* xrm_class         */    NULLQUARK,
+    /* compress_motion   */    FALSE,
+    /* compress_exposure  */   FALSE,
+    /* compress_enterleave*/   FALSE,
+    /* visible_interest          */    FALSE,
+    /* destroy           */    NULL,
+    /* resize            */    NULL,
+    /* expose            */    NULL,
+    /* set_values        */    NULL,
+    /* 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      */  NULL,
+    /* display_accelerator  */ NULL,
+    /* extension           */  NULL
+  }
+};
+
+
+externaldef(widgetclassrec) WidgetClassRec widgetClassRec = {
+{
+    /* superclass         */    (WidgetClass)&unNamedObjClassRec,
+    /* class_name         */    "Core",
+    /* widget_size        */    sizeof(WidgetRec),
+    /* class_initialize   */    NULL,
+    /* class_part_initialize*/  CoreClassPartInitialize,
+    /* class_inited       */    FALSE,
+    /* initialize         */    CoreInitialize,
+    /* initialize_hook    */    NULL,
+    /* realize            */    CoreRealize,
+    /* actions            */    NULL,
+    /* num_actions        */    0,
+    /* resources          */    resources,
+    /* num_resources      */    XtNumber(resources),
+    /* xrm_class          */    NULLQUARK,
+    /* compress_motion    */    FALSE,
+    /* compress_exposure  */    TRUE,
+    /* compress_enterleave*/    FALSE,
+    /* visible_interest   */    FALSE,
+    /* destroy            */    CoreDestroy,
+    /* resize             */    NULL,
+    /* expose             */    NULL,
+    /* set_values         */    CoreSetValues,
+    /* set_values_hook    */    NULL,
+    /* set_values_almost  */    CoreSetValuesAlmost,
+    /* get_values_hook    */    NULL,
+    /* accept_focus       */    NULL,
+    /* version            */    XtVersion,
+    /* callback_offsets   */    NULL,
+    /* tm_table           */    NULL,
+    /* query_geometry       */  NULL,
+    /* display_accelerator  */  NULL,
+    /* extension            */  NULL
+  }
+};
+externaldef (WidgetClass) WidgetClass widgetClass = &widgetClassRec;
+
+externaldef (WidgetClass) WidgetClass coreWidgetClass = &widgetClassRec;
+
+
+/*ARGSUSED*/
+static void XtCopyScreen(
+    Widget      widget,
+    int                offset,
+    XrmValue    *value)
+{
+    value->addr = (XPointer)(&widget->core.screen);
+}
+
+/*
+ * Start of Core methods
+ */
+
+static void CoreClassPartInitialize(
+    register WidgetClass wc)
+{
+    /* We don't need to check for null super since we'll get to object
+       eventually, and it had better define them!  */
+
+    register WidgetClass super = wc->core_class.superclass;
+
+    LOCK_PROCESS;
+    if (wc->core_class.realize == XtInheritRealize) {
+       wc->core_class.realize = super->core_class.realize;
+    }
+
+    if (wc->core_class.accept_focus == XtInheritAcceptFocus) {
+       wc->core_class.accept_focus = super->core_class.accept_focus;
+    }
+
+    if (wc->core_class.display_accelerator == XtInheritDisplayAccelerator) {
+       wc->core_class.display_accelerator =
+               super->core_class.display_accelerator;
+    }
+
+    if (wc->core_class.tm_table == (char *) XtInheritTranslations) {
+       wc->core_class.tm_table =
+               wc->core_class.superclass->core_class.tm_table;
+    } else if (wc->core_class.tm_table != NULL) {
+       wc->core_class.tm_table =
+             (String)XtParseTranslationTable(wc->core_class.tm_table);
+    }
+
+    if (wc->core_class.actions != NULL) {
+       Boolean inPlace;
+
+       if (wc->core_class.version == XtVersionDontCheck)
+           inPlace = True;
+       else
+           inPlace = (wc->core_class.version < XtVersion) ? False : True;
+
+       /* Compile the action table into a more efficient form */
+        wc->core_class.actions = (XtActionList) _XtInitializeActionData(
+           wc->core_class.actions, wc->core_class.num_actions, inPlace);
+    }
+    UNLOCK_PROCESS;
+}
+/* ARGSUSED */
+static void CoreInitialize(
+    Widget   requested_widget,
+    register Widget new_widget,
+    ArgList args,
+    Cardinal *num_args)
+{
+    XtTranslations save1, save2;
+    new_widget->core.event_table = NULL;
+    new_widget->core.tm.proc_table = NULL;
+    new_widget->core.tm.lastEventTime = 0;
+    /* magic semi-resource fetched by GetResources */
+    save1 = (XtTranslations)new_widget->core.tm.current_state;
+    new_widget->core.tm.current_state = NULL;
+    save2 = new_widget->core.tm.translations;
+    LOCK_PROCESS;
+    new_widget->core.tm.translations =
+       (XtTranslations)new_widget->core.widget_class->core_class.tm_table;
+    UNLOCK_PROCESS;
+    if (save1)
+       _XtMergeTranslations(new_widget, save1, save1->operation);
+    if (save2)
+       _XtMergeTranslations(new_widget, save2, save2->operation);
+}
+
+static void CoreRealize(
+    Widget              widget,
+    XtValueMask                 *value_mask,
+    XSetWindowAttributes *attributes)
+{
+    XtCreateWindow(widget, (unsigned int) InputOutput,
+       (Visual *) CopyFromParent, *value_mask, attributes);
+} /* CoreRealize */
+
+static void CoreDestroy (
+     Widget    widget)
+{
+    _XtFreeEventTable(&widget->core.event_table);
+    _XtDestroyTMData(widget);
+    XtUnregisterDrawable(XtDisplay(widget), widget->core.window);
+
+    if (widget->core.popup_list != NULL)
+        XtFree((char *)widget->core.popup_list);
+
+} /* CoreDestroy */
+
+/* ARGSUSED */
+static Boolean CoreSetValues(
+    Widget old, Widget reference, Widget new,
+    ArgList args,
+    Cardinal *num_args)
+{
+    Boolean redisplay;
+    Mask    window_mask;
+    XSetWindowAttributes attributes;
+    XtTranslations save;
+
+    redisplay = FALSE;
+    if  (old->core.tm.translations != new->core.tm.translations) {
+       save = new->core.tm.translations;
+       new->core.tm.translations = old->core.tm.translations;
+       _XtMergeTranslations(new, save, XtTableReplace);
+    }
+
+    /* Check everything that depends upon window being realized */
+    if (XtIsRealized(old)) {
+       window_mask = 0;
+       /* Check window attributes */
+       if (old->core.background_pixel != new->core.background_pixel
+           && new->core.background_pixmap == XtUnspecifiedPixmap) {
+          attributes.background_pixel  = new->core.background_pixel;
+          window_mask |= CWBackPixel;
+          redisplay = TRUE;
+       }
+       if (old->core.background_pixmap != new->core.background_pixmap) {
+          if (new->core.background_pixmap == XtUnspecifiedPixmap) {
+              window_mask |= CWBackPixel;
+              attributes.background_pixel  = new->core.background_pixel;
+          }
+          else {
+              attributes.background_pixmap = new->core.background_pixmap;
+              window_mask &= ~CWBackPixel;
+              window_mask |= CWBackPixmap;
+          }
+          redisplay = TRUE;
+       }
+       if (old->core.border_pixel != new->core.border_pixel
+           && new->core.border_pixmap == XtUnspecifiedPixmap) {
+          attributes.border_pixel  = new->core.border_pixel;
+          window_mask |= CWBorderPixel;
+       }
+       if (old->core.border_pixmap != new->core.border_pixmap) {
+          if (new->core.border_pixmap == XtUnspecifiedPixmap) {
+              window_mask |= CWBorderPixel;
+              attributes.border_pixel  = new->core.border_pixel;
+          }
+          else {
+              attributes.border_pixmap = new->core.border_pixmap;
+              window_mask &= ~CWBorderPixel;
+              window_mask |= CWBorderPixmap;
+          }
+       }
+       if (old->core.depth != new->core.depth) {
+          XtAppWarningMsg(XtWidgetToApplicationContext(old),
+                   "invalidDepth","setValues",XtCXtToolkitError,
+               "Can't change widget depth", (String *)NULL, (Cardinal *)NULL);
+          new->core.depth = old->core.depth;
+       }
+       if (old->core.colormap != new->core.colormap) {
+           window_mask |= CWColormap;
+           attributes.colormap = new->core.colormap;
+       }
+       if (window_mask != 0) {
+           /* Actually change X window attributes */
+           XChangeWindowAttributes(
+               XtDisplay(new), XtWindow(new), window_mask, &attributes);
+       }
+
+       if (old->core.mapped_when_managed != new->core.mapped_when_managed) {
+           Boolean mapped_when_managed = new->core.mapped_when_managed;
+           new->core.mapped_when_managed = !mapped_when_managed;
+           XtSetMappedWhenManaged(new, mapped_when_managed);
+       }
+    } /* if realized */
+
+    return redisplay;
+} /* CoreSetValues */
+
+/*ARGSUSED*/
+static void CoreSetValuesAlmost(
+    Widget             old,
+    Widget             new,
+    XtWidgetGeometry    *request,
+    XtWidgetGeometry    *reply)
+{
+    *request = *reply;
+}
diff --git a/src/Create.c b/src/Create.c
new file mode 100644 (file)
index 0000000..da00192
--- /dev/null
@@ -0,0 +1,786 @@
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "VarargsI.h"
+#include "ShellP.h"
+#include "CreateI.h"
+#ifndef X_NO_RESOURCE_CONFIGURATION_MANAGEMENT
+#include "ResConfigP.h"
+#endif
+#include <stdio.h>
+
+static String XtNxtCreateWidget = "xtCreateWidget";
+static String XtNxtCreatePopupShell = "xtCreatePopupShell";
+
+static void
+CallClassPartInit(WidgetClass ancestor, WidgetClass wc)
+{
+    if (ancestor->core_class.superclass != NULL) {
+       CallClassPartInit(ancestor->core_class.superclass, wc);
+    }
+    if (ancestor->core_class.class_part_initialize != NULL) {
+       (*(ancestor->core_class.class_part_initialize)) (wc);
+    }
+}
+
+void
+XtInitializeWidgetClass(WidgetClass wc)
+{
+    XtEnum inited;
+    LOCK_PROCESS;
+    if (wc->core_class.class_inited) {
+       UNLOCK_PROCESS;
+       return;
+    }
+    inited = 0x01;
+    {
+       WidgetClass pc;
+#define LeaveIfClass(c, d) if (pc == c) { inited = d; break; }
+       for (pc = wc; pc; pc = pc->core_class.superclass) {
+           LeaveIfClass(rectObjClass, 0x01 |
+                        RectObjClassFlag);
+           LeaveIfClass(coreWidgetClass, 0x01 |
+                        RectObjClassFlag |
+                        WidgetClassFlag);
+           LeaveIfClass(compositeWidgetClass, 0x01 |
+                        RectObjClassFlag |
+                        WidgetClassFlag |
+                        CompositeClassFlag);
+           LeaveIfClass(constraintWidgetClass, 0x01 |
+                        RectObjClassFlag |
+                        WidgetClassFlag |
+                        CompositeClassFlag |
+                        ConstraintClassFlag);
+           LeaveIfClass(shellWidgetClass, 0x01 |
+                        RectObjClassFlag |
+                        WidgetClassFlag |
+                        CompositeClassFlag |
+                        ShellClassFlag);
+           LeaveIfClass(wmShellWidgetClass, 0x01 |
+                        RectObjClassFlag |
+                        WidgetClassFlag |
+                        CompositeClassFlag |
+                        ShellClassFlag |
+                        WMShellClassFlag);
+           LeaveIfClass(topLevelShellWidgetClass, 0x01 |
+                        RectObjClassFlag |
+                        WidgetClassFlag |
+                        CompositeClassFlag |
+                        ShellClassFlag |
+                        WMShellClassFlag |
+                        TopLevelClassFlag);
+       }
+#undef LeaveIfClass
+    }
+    if (wc->core_class.version != XtVersion &&
+       wc->core_class.version != XtVersionDontCheck) {
+       String param[3];
+       String mismatch = "Widget class %s version mismatch (recompilation needed):\n  widget %d vs. intrinsics %d.";
+       String recompile = "Widget class %s must be re-compiled.";
+       Cardinal num_params;
+
+       param[0] = wc->core_class.class_name;
+       param[1] = (String) wc->core_class.version;
+       param[2] = (String) XtVersion;
+
+       if (wc->core_class.version == (11 * 1000 + 5) || /* MIT X11R5 */
+           wc->core_class.version == (11 * 1000 + 4)) { /* MIT X11R4 */
+           if ((inited & WMShellClassFlag) &&
+               (sizeof(Boolean) != sizeof(char) ||
+                sizeof(Atom) != sizeof(Widget) ||
+                sizeof(Atom) != sizeof(String))) {
+               num_params=3;
+               XtWarningMsg("versionMismatch","widget",XtCXtToolkitError,
+                            mismatch, param, &num_params);
+               num_params=1;
+               XtErrorMsg("R4orR5versionMismatch","widget",XtCXtToolkitError,
+                          recompile, param, &num_params);
+
+           }
+       }
+       else if (wc->core_class.version == (11 * 1000 + 3)) { /* MIT X11R3 */
+           if (inited & ShellClassFlag) {
+               num_params=1;
+               XtWarningMsg("r3versionMismatch","widget",XtCXtToolkitError,
+                            "Shell Widget class %s binary compiled for R3",
+                            param,&num_params);
+               XtErrorMsg("R3versionMismatch","widget",XtCXtToolkitError,
+                          recompile, param, &num_params);
+           }
+       }
+       else {
+           num_params=3;
+           XtWarningMsg("versionMismatch","widget",XtCXtToolkitError,
+                        mismatch, param, &num_params);
+           if (wc->core_class.version == (2 * 1000 + 2)) /* MIT X11R2 */ {
+               num_params=1;
+               XtErrorMsg("r2versionMismatch","widget",XtCXtToolkitError,
+                          recompile, param, &num_params);
+           }
+       }
+    }
+
+    if ((wc->core_class.superclass != NULL)
+           && (!(wc->core_class.superclass->core_class.class_inited)))
+       XtInitializeWidgetClass(wc->core_class.superclass);
+
+    if (wc->core_class.class_initialize != NULL)
+       (*(wc->core_class.class_initialize))();
+    CallClassPartInit(wc, wc);
+    wc->core_class.class_inited = inited;
+    UNLOCK_PROCESS;
+}
+
+static void
+CallInitialize (
+    WidgetClass class,
+    Widget      req_widget,
+    Widget      new_widget,
+    ArgList     args,
+    Cardinal    num_args)
+{
+    WidgetClass superclass;
+    XtInitProc initialize;
+    XtArgsProc initialize_hook;
+
+    LOCK_PROCESS;
+    superclass = class->core_class.superclass;
+    UNLOCK_PROCESS;
+    if (superclass)
+        CallInitialize (superclass, req_widget, new_widget, args, num_args);
+    LOCK_PROCESS;
+    initialize = class->core_class.initialize;
+    UNLOCK_PROCESS;
+    if (initialize)
+       (*initialize) (req_widget, new_widget, args, &num_args);
+    LOCK_PROCESS;
+    initialize_hook = class->core_class.initialize_hook;
+    UNLOCK_PROCESS;
+    if (initialize_hook)
+       (*initialize_hook) (new_widget, args, &num_args);
+}
+
+static void
+CallConstraintInitialize (
+    ConstraintWidgetClass class,
+    Widget     req_widget,
+    Widget     new_widget,
+    ArgList    args,
+    Cardinal   num_args)
+{
+    WidgetClass superclass;
+    XtInitProc initialize;
+
+    LOCK_PROCESS;
+    superclass = class->core_class.superclass;
+    UNLOCK_PROCESS;
+    if (superclass != constraintWidgetClass)
+       CallConstraintInitialize((ConstraintWidgetClass) superclass,
+               req_widget, new_widget, args, num_args);
+    LOCK_PROCESS;
+    initialize = class->constraint_class.initialize;
+    UNLOCK_PROCESS;
+    if (initialize)
+        (*initialize) (req_widget, new_widget, args, &num_args);
+}
+
+static Widget
+xtWidgetAlloc(
+    WidgetClass widget_class,
+    ConstraintWidgetClass parent_constraint_class,
+    Widget parent,
+    String name,
+    ArgList     args,          /* must be NULL if typed_args is non-NULL */
+    Cardinal    num_args,
+    XtTypedArgList typed_args, /* must be NULL if args is non-NULL */
+    Cardinal   num_typed_args)
+{
+    Widget widget;
+    Cardinal                wsize, csize = 0;
+    ObjectClassExtension    ext;
+
+    LOCK_PROCESS;
+    if (! (widget_class->core_class.class_inited))
+       XtInitializeWidgetClass(widget_class);
+    ext = (ObjectClassExtension)
+       XtGetClassExtension(widget_class,
+                           XtOffsetOf(ObjectClassRec, object_class.extension),
+                           NULLQUARK, XtObjectExtensionVersion,
+                           sizeof(ObjectClassExtensionRec));
+    if (parent_constraint_class)
+       csize = parent_constraint_class->constraint_class.constraint_size;
+    if (ext && ext->allocate) {
+       XtAllocateProc allocate;
+       Cardinal extra = 0;
+       Cardinal nargs = num_args;
+       Cardinal ntyped = num_typed_args;
+       allocate = ext->allocate;
+       UNLOCK_PROCESS;
+       (*allocate)(widget_class, &csize, &extra, args, &nargs,
+                   typed_args, &ntyped, &widget, NULL);
+    } else {
+       wsize = widget_class->core_class.widget_size;
+       UNLOCK_PROCESS;
+       if (csize) {
+           if (sizeof(struct {char a; double b;}) !=
+               (sizeof(struct {char a; unsigned long b;}) -
+                sizeof(unsigned long) + sizeof(double))) {
+               if (csize && !(csize & (sizeof(double) - 1)))
+                   wsize = (wsize + sizeof(double) - 1) & ~(sizeof(double)-1);
+           }
+       }
+       widget = (Widget) __XtMalloc((unsigned)(wsize + csize));
+       bzero(widget, wsize + csize);
+       widget->core.constraints =
+           (csize ? (XtPointer)((char *)widget + wsize) : NULL);
+    }
+    widget->core.self = widget;
+    widget->core.parent = parent;
+    widget->core.widget_class = widget_class;
+    widget->core.xrm_name = StringToName((name != NULL) ? name : "");
+    widget->core.being_destroyed =
+       (parent != NULL ? parent->core.being_destroyed : FALSE);
+    return widget;
+}
+
+static void
+CompileCallbacks(
+    Widget widget)
+{
+    CallbackTable offsets;
+    InternalCallbackList* cl;
+    int i;
+
+    LOCK_PROCESS;
+    offsets = (CallbackTable)
+       widget->core.widget_class->core_class.callback_private;
+
+    for (i = (int)(long) *(offsets++); --i >= 0; offsets++) {
+       cl = (InternalCallbackList *)
+           ((char *) widget - (*offsets)->xrm_offset - 1);
+       if (*cl)
+           *cl = _XtCompileCallbackList((XtCallbackList) *cl);
+    }
+    UNLOCK_PROCESS;
+}
+
+static Widget
+xtCreate(
+    char        *name,
+    char        *class,
+    WidgetClass widget_class,
+    Widget      parent,
+    Screen*     default_screen, /* undefined when creating a nonwidget */
+    ArgList     args,          /* must be NULL if typed_args is non-NULL */
+    Cardinal    num_args,
+    XtTypedArgList typed_args, /* must be NULL if args is non-NULL */
+    Cardinal   num_typed_args,
+    ConstraintWidgetClass parent_constraint_class,
+        /* NULL if not a subclass of Constraint or if child is popup shell */
+    XtWidgetProc post_proc)
+{
+    /* need to use strictest alignment rules possible in next two decls. */
+    double                  widget_cache[100];
+    double                  constraint_cache[20];
+    Widget                  req_widget;
+    XtPointer               req_constraints = NULL;
+    Cardinal                wsize, csize;
+    Widget                 widget;
+    XtCacheRef             *cache_refs;
+    Cardinal               i;
+    XtCreateHookDataRec     call_data;
+
+    widget = xtWidgetAlloc(widget_class, parent_constraint_class, parent,
+               name, args, num_args, typed_args, num_typed_args);
+
+    if (XtIsRectObj(widget)) {
+       widget->core.managed = FALSE;
+    }
+    if (XtIsWidget(widget)) {
+       widget->core.name = XrmNameToString(widget->core.xrm_name);
+        widget->core.screen = default_screen;
+        widget->core.tm.translations = NULL;
+       widget->core.window = (Window) 0;
+       widget->core.visible = TRUE;
+       widget->core.popup_list = NULL;
+       widget->core.num_popups = 0;
+    };
+    LOCK_PROCESS;
+    if (XtIsApplicationShell(widget)) {
+       ApplicationShellWidget a = (ApplicationShellWidget) widget;
+       if (class != NULL)
+           a->application.xrm_class = StringToClass(class);
+       else
+           a->application.xrm_class = widget_class->core_class.xrm_class;
+       a->application.class = XrmQuarkToString(a->application.xrm_class);
+    }
+    UNLOCK_PROCESS;
+
+    /* fetch resources */
+    cache_refs = _XtGetResources(widget, args, num_args,
+               typed_args, &num_typed_args);
+
+    /* Convert typed arg list to arg list */
+    if (typed_args != NULL && num_typed_args > 0) {
+       args = (ArgList)ALLOCATE_LOCAL(sizeof(Arg) * num_typed_args);
+       if (args == NULL) _XtAllocError(NULL);
+       for (i = 0; i < num_typed_args; i++) {
+           args[i].name = typed_args[i].name;
+           args[i].value = typed_args[i].value;
+       }
+       num_args = num_typed_args;
+    }
+
+    CompileCallbacks(widget);
+
+    if (cache_refs != NULL) {
+       XtAddCallback(widget, XtNdestroyCallback,
+               XtCallbackReleaseCacheRefList, (XtPointer)cache_refs );
+    }
+
+    wsize = widget_class->core_class.widget_size;
+    csize = 0;
+    req_widget = (Widget) XtStackAlloc(wsize, widget_cache);
+    (void) memmove ((char *) req_widget, (char *) widget, (int) wsize);
+    CallInitialize (XtClass(widget), req_widget, widget, args, num_args);
+    if (parent_constraint_class != NULL) {
+        csize = parent_constraint_class->constraint_class.constraint_size;
+       if (csize) {
+           req_constraints = XtStackAlloc(csize, constraint_cache);
+           (void) memmove((char*)req_constraints, widget->core.constraints,
+                       (int)csize);
+           req_widget->core.constraints = req_constraints;
+       } else req_widget->core.constraints = NULL;
+       CallConstraintInitialize(parent_constraint_class, req_widget, widget,
+               args, num_args);
+       if (csize) {
+           XtStackFree(req_constraints, constraint_cache);
+       }
+    }
+    XtStackFree((XtPointer)req_widget, widget_cache);
+    if (post_proc != (XtWidgetProc) NULL) {
+       Widget hookobj;
+       (*post_proc)(widget);
+       hookobj = XtHooksOfDisplay((default_screen != (Screen*) NULL) ?
+               default_screen->display :
+               XtDisplayOfObject(parent));
+       if (XtHasCallbacks(hookobj, XtNcreateHook) == XtCallbackHasSome) {
+
+           call_data.type = XtHcreate;
+           call_data.widget = widget;
+           call_data.args = args;
+           call_data.num_args = num_args;
+           XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.createhook_callbacks,
+               (XtPointer)&call_data);
+       }
+    }
+    if (typed_args != NULL) {
+       while (num_typed_args-- > 0) {
+
+           /* In GetResources we may have dynamically alloc'd store to hold */
+           /* a copy of a resource which was larger then sizeof(XtArgVal). */
+           /* We must free this store now in order to prevent a memory leak */
+           /* A typed arg that has a converted value in dynamic store has a */
+           /* negated size field. */
+
+           if (typed_args->type != NULL && typed_args->size < 0) {
+               XtFree((char*)typed_args->value);
+               typed_args->size = -(typed_args->size);
+           }
+           typed_args++;
+       }
+       DEALLOCATE_LOCAL((char*)args);
+    }
+    return (widget);
+}
+
+static void
+widgetPostProc(Widget w)
+{
+    XtWidgetProc insert_child;
+    Widget parent = XtParent(w);
+    String param = XtName(w);
+    Cardinal num_params = 1;
+
+    if (XtIsComposite(parent)) {
+       LOCK_PROCESS;
+       insert_child = ((CompositeWidgetClass) parent->core.widget_class)->
+           composite_class.insert_child;
+       UNLOCK_PROCESS;
+    } else {
+       return;
+    }
+    if (insert_child == NULL) {
+       XtAppErrorMsg(XtWidgetToApplicationContext(parent),
+               "nullProc","insertChild",XtCXtToolkitError,
+               "\"%s\" parent has NULL insert_child method",
+               &param, &num_params);
+    } else {
+       (*insert_child) (w);
+    }
+}
+
+Widget
+_XtCreateWidget(
+    String      name,
+    WidgetClass widget_class,
+    Widget      parent,
+    ArgList     args,
+    Cardinal    num_args,
+    XtTypedArgList typed_args,
+    Cardinal   num_typed_args)
+{
+    register Widget        widget;
+    ConstraintWidgetClass   cwc;
+    Screen*                 default_screen;
+    XtEnum                 class_inited;
+    String                 params[3];
+    Cardinal               num_params;
+
+    params[0] = name;
+    num_params = 1;
+
+    if (parent == NULL) {
+       XtErrorMsg("invalidParent", XtNxtCreateWidget, XtCXtToolkitError,
+                  "XtCreateWidget \"%s\" requires non-NULL parent",
+                  params, &num_params);
+    } else if (widget_class == NULL) {
+       XtAppErrorMsg(XtWidgetToApplicationContext(parent),
+                     "invalidClass", XtNxtCreateWidget, XtCXtToolkitError,
+                     "XtCreateWidget \"%s\" requires non-NULL widget class",
+                     params, &num_params);
+    }
+    LOCK_PROCESS;
+    if (!widget_class->core_class.class_inited)
+       XtInitializeWidgetClass(widget_class);
+    class_inited = widget_class->core_class.class_inited;
+    UNLOCK_PROCESS;
+    if ((class_inited & WidgetClassFlag) == 0) {
+       /* not a widget */
+       default_screen = NULL;
+       if (XtIsComposite(parent)) {
+           CompositeClassExtension ext;
+           ext = (CompositeClassExtension)
+               XtGetClassExtension(XtClass(parent),
+                     XtOffsetOf(CompositeClassRec, composite_class.extension),
+                     NULLQUARK, 1L, (Cardinal) 0);
+           LOCK_PROCESS;
+           if (ext &&
+               (ext->version > XtCompositeExtensionVersion ||
+                ext->record_size > sizeof(CompositeClassExtensionRec))) {
+               params[1] = XtClass(parent)->core_class.class_name;
+               num_params = 2;
+               XtAppWarningMsg(XtWidgetToApplicationContext(parent),
+                               "invalidExtension", XtNxtCreateWidget,
+                               XtCXtToolkitError,
+          "widget \"%s\" class %s has invalid CompositeClassExtension record",
+                               params, &num_params);
+           }
+           if (!ext || !ext->accepts_objects) {
+               params[1] = XtName(parent);
+               num_params = 2;
+               XtAppErrorMsg(XtWidgetToApplicationContext(parent),
+                             "nonWidget", XtNxtCreateWidget,XtCXtToolkitError,
+"attempt to add non-widget child \"%s\" to parent \"%s\" which supports only widgets",
+                             params, &num_params);
+           }
+           UNLOCK_PROCESS;
+       }
+    } else {
+       default_screen = parent->core.screen;
+    }
+
+    if (XtIsConstraint(parent)) {
+       cwc = (ConstraintWidgetClass) parent->core.widget_class;
+    } else {
+       cwc = NULL;
+    }
+    widget = xtCreate(name, (char *)NULL, widget_class, parent,
+               default_screen, args, num_args,
+               typed_args, num_typed_args, cwc, widgetPostProc);
+    return (widget);
+}
+
+Widget
+XtCreateWidget(
+    _Xconst char* name,
+    WidgetClass widget_class,
+    Widget     parent,
+    ArgList    args,
+    Cardinal    num_args
+    )
+{
+    Widget retval;
+    WIDGET_TO_APPCON(parent);
+
+    LOCK_APP(app);
+    retval = _XtCreateWidget((String)name, widget_class, parent, args, num_args,
+               (XtTypedArgList)NULL, (Cardinal)0);
+    UNLOCK_APP(app);
+    return retval;
+}
+
+
+Widget
+XtCreateManagedWidget(
+    _Xconst char* name,
+    WidgetClass widget_class,
+    Widget      parent,
+    ArgList     args,
+    Cardinal    num_args
+    )
+{
+    register Widget        widget;
+    WIDGET_TO_APPCON(parent);
+
+    LOCK_APP(app);
+    XtCheckSubclass(parent, compositeWidgetClass, "in XtCreateManagedWidget");
+    widget = _XtCreateWidget((String)name, widget_class, parent, args,
+               num_args, (XtTypedArgList)NULL, (Cardinal) 0);
+    XtManageChild(widget);
+    UNLOCK_APP(app);
+    return widget;
+}
+
+static void
+popupPostProc(Widget w)
+{
+    Widget parent = XtParent(w);
+
+    parent->core.popup_list =
+       (WidgetList) XtRealloc((char*) parent->core.popup_list,
+               (unsigned) (parent->core.num_popups+1) * sizeof(Widget));
+    parent->core.popup_list[parent->core.num_popups++] = w;
+}
+
+Widget
+_XtCreatePopupShell(
+    String      name,
+    WidgetClass widget_class,
+    Widget      parent,
+    ArgList     args,
+    Cardinal    num_args,
+    XtTypedArgList      typed_args,
+    Cardinal            num_typed_args)
+{
+    register Widget widget;
+    Screen* default_screen;
+
+    if (parent == NULL) {
+       XtErrorMsg("invalidParent",XtNxtCreatePopupShell,XtCXtToolkitError,
+               "XtCreatePopupShell requires non-NULL parent",
+               (String *)NULL, (Cardinal *)NULL);
+    } else if (widget_class == NULL) {
+       XtAppErrorMsg(XtWidgetToApplicationContext(parent),
+               "invalidClass",XtNxtCreatePopupShell,XtCXtToolkitError,
+               "XtCreatePopupShell requires non-NULL widget class",
+               (String *)NULL, (Cardinal *)NULL);
+    }
+    XtCheckSubclass(parent, coreWidgetClass, "in XtCreatePopupShell");
+    default_screen = parent->core.screen;
+    widget = xtCreate(name, (char *)NULL, widget_class, parent,
+               default_screen, args, num_args, typed_args,
+               num_typed_args, (ConstraintWidgetClass)NULL,
+               popupPostProc);
+
+#ifndef X_NO_RESOURCE_CONFIGURATION_MANAGEMENT
+    XtAddEventHandler (widget, (EventMask) PropertyChangeMask, FALSE,
+               (XtEventHandler) _XtResourceConfigurationEH, NULL);
+#endif
+    return(widget);
+}
+
+Widget
+XtCreatePopupShell(
+    _Xconst char* name,
+    WidgetClass widget_class,
+    Widget      parent,
+    ArgList     args,
+    Cardinal    num_args
+    )
+{
+    Widget retval;
+    WIDGET_TO_APPCON(parent);
+
+    LOCK_APP(app);
+    retval = _XtCreatePopupShell((String)name, widget_class, parent, args,
+               num_args, (XtTypedArgList)NULL, (Cardinal)0);
+    UNLOCK_APP(app);
+    return retval;
+}
+
+Widget
+_XtAppCreateShell(
+    String      name,
+    String      class,
+    WidgetClass widget_class,
+    Display*    display,
+    ArgList     args,
+    Cardinal    num_args,
+    XtTypedArgList typed_args,
+    Cardinal   num_typed_args)
+{
+    Widget shell;
+
+    if (widget_class == NULL) {
+       XtAppErrorMsg(XtDisplayToApplicationContext(display),
+               "invalidClass","xtAppCreateShell",XtCXtToolkitError,
+               "XtAppCreateShell requires non-NULL widget class",
+               (String *)NULL, (Cardinal *)NULL);
+    }
+    if (name == NULL)
+       name = XrmNameToString(_XtGetPerDisplay(display)->name);
+    shell = xtCreate(name, class, widget_class, (Widget)NULL,
+               (Screen*)DefaultScreenOfDisplay(display),
+               args, num_args, typed_args, num_typed_args,
+               (ConstraintWidgetClass) NULL, _XtAddShellToHookObj);
+
+#ifndef X_NO_RESOURCE_CONFIGURATION_MANAGEMENT
+    XtAddEventHandler (shell, (EventMask) PropertyChangeMask, FALSE,
+               (XtEventHandler) _XtResourceConfigurationEH, NULL);
+#endif
+
+    return shell;
+}
+
+Widget
+XtAppCreateShell(
+    _Xconst char*       name,
+    _Xconst char*       class,
+    WidgetClass         widget_class,
+    Display             *display,
+    ArgList             args,
+    Cardinal            num_args
+    )
+{
+    Widget retval;
+    DPY_TO_APPCON(display);
+
+    LOCK_APP(app);
+    retval = _XtAppCreateShell((String)name, (String)class, widget_class,
+               display, args, num_args, (XtTypedArgList)NULL, (Cardinal)0);
+    UNLOCK_APP(app);
+    return retval;
+}
+
+/* ARGSUSED */
+Widget
+XtCreateApplicationShell(
+    _Xconst char* name,                /* unused in R3 and later */
+    WidgetClass widget_class,
+    ArgList     args,
+    Cardinal    num_args
+    )
+{
+    Widget retval;
+    Display* dpy;
+    XrmClass class;
+    XtAppContext app = _XtDefaultAppContext();
+
+    LOCK_APP(app);
+    dpy = app->list[0];
+    class = _XtGetPerDisplay(dpy)->class;
+
+    retval = _XtAppCreateShell((String)NULL, XrmQuarkToString((XrmQuark)class),
+               widget_class, dpy, args, num_args,
+               (XtTypedArgList)NULL, (Cardinal)0);
+    UNLOCK_APP(app);
+    return retval;
+}
+
+Widget
+_XtCreateHookObj(Screen* screen)
+{
+    Widget req_widget;
+    double widget_cache[100];
+    Cardinal wsize = 0;
+    Widget hookobj = xtWidgetAlloc(hookObjectClass,
+               (ConstraintWidgetClass)NULL,
+               (Widget)NULL, "hooks",
+               (ArgList)NULL, (Cardinal)0,
+               (XtTypedArgList)NULL, (Cardinal)0);
+
+    ((HookObject)hookobj)->hooks.screen = screen;
+    (void) _XtGetResources(hookobj, (ArgList)NULL, 0,
+               (XtTypedArgList)NULL, &wsize);
+    CompileCallbacks(hookobj);
+    wsize = hookObjectClass->core_class.widget_size;
+    req_widget = (Widget) XtStackAlloc(wsize, widget_cache);
+    (void) memmove ((char *) req_widget, (char *) hookobj, (int) wsize);
+    CallInitialize (hookObjectClass, req_widget, hookobj,
+               (ArgList)NULL, (Cardinal) 0);
+    XtStackFree((XtPointer)req_widget, widget_cache);
+    return hookobj;
+}
diff --git a/src/Destroy.c b/src/Destroy.c
new file mode 100644 (file)
index 0000000..e952bcc
--- /dev/null
@@ -0,0 +1,382 @@
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+
+struct _DestroyRec {
+    int dispatch_level;
+    Widget widget;
+};
+
+static void Recursive(Widget widget, XtWidgetProc proc)
+{
+    register Cardinal i;
+    CompositePart   *cwp;
+
+    /* Recurse down normal children */
+    if (XtIsComposite(widget)) {
+       cwp = &(((CompositeWidget) widget)->composite);
+       for (i = 0; i < cwp->num_children; i++) {
+           Recursive(cwp->children[i], proc);
+       }
+    }
+
+    /* Recurse down popup children */
+    if (XtIsWidget(widget)) {
+       for (i = 0; i < widget->core.num_popups; i++) {
+           Recursive(widget->core.popup_list[i], proc);
+       }
+    }
+
+    /* Finally, apply procedure to this widget */
+    (*proc) (widget);
+} /* Recursive */
+
+static void Phase1Destroy (Widget widget)
+{
+    Widget hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));
+
+    widget->core.being_destroyed = TRUE;
+    if (XtHasCallbacks(hookobj, XtNdestroyHook) == XtCallbackHasSome) {
+       XtDestroyHookDataRec call_data;
+
+       call_data.type = XtHdestroy;
+       call_data.widget = widget;
+       XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.destroyhook_callbacks,
+               (XtPointer) &call_data);
+    }
+} /* Phase1Destroy */
+
+static void Phase2Callbacks(Widget widget)
+{
+    if (widget->core.destroy_callbacks != NULL) {
+       XtCallCallbackList(widget,
+                          widget->core.destroy_callbacks, (XtPointer) NULL);
+    }
+} /* Phase2Callbacks */
+
+static void Phase2Destroy(register Widget widget)
+{
+    register WidgetClass           class;
+    register ConstraintWidgetClass  cwClass;
+    ObjectClassExtension           ext;
+
+    /* Call constraint destroy procedures */
+    if (XtParent(widget) != NULL && !XtIsShell(widget) && XtIsConstraint(XtParent(widget))) {
+       LOCK_PROCESS;
+       cwClass = (ConstraintWidgetClass)XtParent(widget)->core.widget_class;
+       UNLOCK_PROCESS;
+       for (;;) {
+           XtWidgetProc destroy;
+
+           LOCK_PROCESS;
+           destroy = cwClass->constraint_class.destroy;
+           UNLOCK_PROCESS;
+           if (destroy)
+               (*destroy) (widget);
+            if (cwClass == (ConstraintWidgetClass)constraintWidgetClass) break;
+           LOCK_PROCESS;
+           cwClass = (ConstraintWidgetClass) cwClass->core_class.superclass;
+           UNLOCK_PROCESS;
+       }
+    }
+
+    /* Call widget destroy procedures */
+    LOCK_PROCESS;
+    for (class = widget->core.widget_class;
+        class != NULL;
+        class = class->core_class.superclass) {
+       XtWidgetProc destroy;
+
+       destroy = class->core_class.destroy;
+       UNLOCK_PROCESS;
+       if (destroy)
+           (*destroy) (widget);
+       LOCK_PROCESS;
+    }
+
+    /* Call widget deallocate procedure */
+    ext = (ObjectClassExtension)
+       XtGetClassExtension(widget->core.widget_class,
+                           XtOffsetOf(CoreClassPart, extension),
+                           NULLQUARK, XtObjectExtensionVersion,
+                           sizeof(ObjectClassExtensionRec));
+    if (ext && ext->deallocate) {
+       XtDeallocateProc deallocate;
+       deallocate = ext->deallocate;
+       UNLOCK_PROCESS;
+       (*deallocate)(widget, NULL);
+    } else {
+       UNLOCK_PROCESS;
+       XtFree((char *)widget);
+    }
+} /* Phase2Destroy */
+
+static Boolean IsDescendant(Widget widget, Widget root)
+{
+    while ((widget = XtParent(widget)) != root) {
+       if (widget == NULL) return False;
+    }
+    return True;
+}
+
+static void XtPhase2Destroy (Widget widget)
+{
+    Display        *display = NULL;
+    Window         window;
+    Widget          parent;
+    XtAppContext    app = XtWidgetToApplicationContext(widget);
+    Widget         outerInPhase2Destroy = app->in_phase2_destroy;
+    int                    starting_count = app->destroy_count;
+    Boolean        isPopup = False;
+
+    /* invalidate focus trace cache for this display */
+    _XtGetPerDisplay(XtDisplayOfObject(widget))->pdi.traceDepth = 0;
+
+    parent = widget->core.parent;
+
+    if (parent && XtIsWidget(parent) && parent->core.num_popups) {
+       Cardinal i;
+       for (i = 0; i < parent->core.num_popups; i++) {
+           if (parent->core.popup_list[i] == widget) {
+               isPopup = True;
+               break;
+           }
+       }
+    }
+
+    if (!isPopup && parent && XtIsComposite(parent)) {
+       XtWidgetProc delete_child;
+
+       LOCK_PROCESS;
+       delete_child =
+           ((CompositeWidgetClass) parent->core.widget_class)->
+               composite_class.delete_child;
+       UNLOCK_PROCESS;
+        if (XtIsRectObj(widget)) {
+                   XtUnmanageChild(widget);
+        }
+       if (delete_child == NULL) {
+           String param;
+           Cardinal num_params = 1;
+
+           LOCK_PROCESS;
+           param = parent->core.widget_class->core_class.class_name;
+           UNLOCK_PROCESS;
+           XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+               "invalidProcedure","deleteChild",XtCXtToolkitError,
+               "null delete_child procedure for class %s in XtDestroy",
+               &param, &num_params);
+       } else {
+           (*delete_child) (widget);
+       }
+    }
+
+    /* widget is freed in Phase2Destroy, so retrieve window now.
+     * Shells destroy their own windows, to prevent window leaks in
+     * popups; this test is practical only when XtIsShell() is cheap.
+     */
+    if (XtIsShell(widget) || !XtIsWidget(widget)) {
+       window = 0;
+    }
+    else {
+       display = XtDisplay(widget);
+       window = widget->core.window;
+    }
+
+    Recursive(widget, Phase2Callbacks);
+    if (app->destroy_count > starting_count) {
+       int i = starting_count;
+       while (i < app->destroy_count) {
+
+           DestroyRec * dr = app->destroy_list + i;
+           if (IsDescendant(dr->widget, widget)) {
+               Widget descendant = dr->widget;
+               register int j;
+               app->destroy_count--;
+               for (j = app->destroy_count - i; --j >= 0; dr++)
+                   *dr = *(dr + 1);
+               XtPhase2Destroy(descendant);
+           }
+           else i++;
+       }
+    }
+
+    app->in_phase2_destroy = widget;
+    Recursive(widget, Phase2Destroy);
+    app->in_phase2_destroy = outerInPhase2Destroy;
+
+    if (isPopup) {
+       Cardinal i;
+       for (i = 0; i < parent->core.num_popups; i++)
+           if (parent->core.popup_list[i] == widget) {
+               parent->core.num_popups--;
+               while (i < parent->core.num_popups) {
+                   parent->core.popup_list[i] = parent->core.popup_list[i+1];
+                   i++;
+               }
+               break;
+           }
+    }
+
+    /* %%% the following parent test hides a more serious problem,
+       but it avoids breaking those who depended on the old bug
+       until we have time to fix it properly. */
+
+    if (window && (parent == NULL || !parent->core.being_destroyed))
+       XDestroyWindow(display, window);
+} /* XtPhase2Destroy */
+
+
+void _XtDoPhase2Destroy(XtAppContext app, int dispatch_level)
+{
+    /* Phase 2 must occur in fifo order.  List is not necessarily
+     * contiguous in dispatch_level.
+     */
+
+    int i = 0;
+    while (i < app->destroy_count) {
+
+       /* XtPhase2Destroy can result in calls to XtDestroyWidget,
+        * and these could cause app->destroy_list to be reallocated.
+        */
+
+       DestroyRec* dr = app->destroy_list + i;
+       if (dr->dispatch_level >= dispatch_level)  {
+           Widget w = dr->widget;
+           register int j;
+           app->destroy_count--;
+           for (j = app->destroy_count - i; --j >=0; dr++)
+               *dr = *(dr + 1);
+           XtPhase2Destroy(w);
+       }
+       else i++;
+    }
+}
+
+
+void XtDestroyWidget (Widget widget)
+{
+    XtAppContext app;
+    DestroyRec *dr, *dr2;
+
+    app = XtWidgetToApplicationContext(widget);
+    LOCK_APP(app);
+    if (widget->core.being_destroyed) {
+       UNLOCK_APP(app);
+       return;
+    }
+    Recursive(widget, Phase1Destroy);
+
+    if (app->in_phase2_destroy &&
+       IsDescendant(widget, app->in_phase2_destroy))
+    {
+       XtPhase2Destroy(widget);
+       UNLOCK_APP(app);
+       return;
+    }
+
+    if (app->destroy_count == app->destroy_list_size) {
+       app->destroy_list_size += 10;
+       app->destroy_list = (DestroyRec*)
+           XtRealloc( (char*)app->destroy_list,
+                      (unsigned)sizeof(DestroyRec)*app->destroy_list_size
+                     );
+    }
+    dr = app->destroy_list + app->destroy_count++;
+    dr->dispatch_level = app->dispatch_level;
+    dr->widget = widget;
+
+    if (app->dispatch_level > 1) {
+       int i;
+       for (i = app->destroy_count - 1; i;) {
+           /* this handles only one case of nesting difficulties */
+           dr = app->destroy_list + (--i);
+           if (dr->dispatch_level < app->dispatch_level &&
+               IsDescendant(dr->widget, widget)) {
+               dr2 = app->destroy_list + (app->destroy_count-1);
+               dr2->dispatch_level = dr->dispatch_level;
+               break;
+           }
+       }
+    }
+
+    if (_XtSafeToDestroy(app)) {
+       app->dispatch_level = 1; /* avoid nested _XtDoPhase2Destroy */
+       _XtDoPhase2Destroy(app, 0);
+       app->dispatch_level = 0;
+    }
+    UNLOCK_APP(app);
+
+} /* XtDestroyWidget */
diff --git a/src/Display.c b/src/Display.c
new file mode 100644 (file)
index 0000000..4ccf079
--- /dev/null
@@ -0,0 +1,771 @@
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#ifndef X_NO_RESOURCE_CONFIGURATION_MANAGEMENT
+#include "ResConfigP.h"
+#endif
+
+#include <stdlib.h>
+
+#ifdef XTHREADS
+void (*_XtProcessLock)(void) = NULL;
+void (*_XtProcessUnlock)(void) = NULL;
+void (*_XtInitAppLock)(XtAppContext) = NULL;
+#endif
+
+static String XtNnoPerDisplay = "noPerDisplay";
+
+ProcessContext _XtGetProcessContext(void)
+{
+    static ProcessContextRec processContextRec = {
+       (XtAppContext)NULL,
+       (XtAppContext)NULL,
+       (ConverterTable)NULL,
+       {(XtLanguageProc)NULL, (XtPointer)NULL}
+    };
+
+    return &processContextRec;
+}
+
+
+XtAppContext _XtDefaultAppContext(void)
+{
+    ProcessContext process = _XtGetProcessContext();
+    XtAppContext app;
+
+    LOCK_PROCESS;
+    if (process->defaultAppContext == NULL) {
+       process->defaultAppContext = XtCreateApplicationContext();
+    }
+    app = process->defaultAppContext;
+    UNLOCK_PROCESS;
+    return app;
+}
+
+static void AddToAppContext(
+       Display *d,
+       XtAppContext app)
+{
+#define DISPLAYS_TO_ADD 4
+
+       if (app->count >= app->max) {
+           app->max += DISPLAYS_TO_ADD;
+           app->list = (Display **) XtRealloc((char *)app->list,
+                   (unsigned) app->max * sizeof(Display *));
+       }
+
+       app->list[app->count++] = d;
+       app->rebuild_fdlist = TRUE;
+#ifndef USE_POLL
+       if (ConnectionNumber(d) + 1 > app->fds.nfds) {
+           app->fds.nfds = ConnectionNumber(d) + 1;
+       }
+#else
+       app->fds.nfds++;
+#endif
+#undef DISPLAYS_TO_ADD
+}
+
+static void XtDeleteFromAppContext(
+       Display *d,
+       register XtAppContext app)
+{
+       register int i;
+
+       for (i = 0; i < app->count; i++) if (app->list[i] == d) break;
+
+       if (i < app->count) {
+           if (i <= app->last && app->last > 0) app->last--;
+           for (i++; i < app->count; i++) app->list[i-1] = app->list[i];
+           app->count--;
+       }
+       app->rebuild_fdlist = TRUE;
+#ifndef USE_POLL
+       if ((ConnectionNumber(d) + 1) == app->fds.nfds)
+           app->fds.nfds--;
+       else                    /* Unnecessary, just to be fool-proof */
+           FD_CLR(ConnectionNumber(d), &app->fds.rmask);
+#else
+       app->fds.nfds--;
+#endif
+}
+
+static XtPerDisplay NewPerDisplay(
+       Display *dpy)
+{
+       PerDisplayTablePtr pd;
+
+       pd = XtNew(PerDisplayTable);
+       LOCK_PROCESS;
+       pd->dpy = dpy;
+       pd->next = _XtperDisplayList;
+       _XtperDisplayList = pd;
+       UNLOCK_PROCESS;
+       return &(pd->perDpy);
+}
+
+static XtPerDisplay InitPerDisplay(
+    Display *dpy,
+    XtAppContext app,
+    _Xconst char * name,
+    _Xconst char * classname)
+{
+    XtPerDisplay pd;
+
+    AddToAppContext(dpy, app);
+
+    pd = NewPerDisplay(dpy);
+    _XtHeapInit(&pd->heap);
+    pd->destroy_callbacks = NULL;
+    pd->region = XCreateRegion();
+    pd->case_cvt = NULL;
+    pd->defaultKeycodeTranslator = XtTranslateKey;
+    pd->keysyms_serial = 0;
+    pd->keysyms = NULL;
+    XDisplayKeycodes(dpy, &pd->min_keycode, &pd->max_keycode);
+    pd->modKeysyms = NULL;
+    pd->modsToKeysyms = NULL;
+    pd->appContext = app;
+    pd->name = XrmStringToName(name);
+    pd->class = XrmStringToClass(classname);
+    pd->being_destroyed = False;
+    pd->GClist = NULL;
+    pd->pixmap_tab = NULL;
+    pd->language = NULL;
+    pd->rv = False;
+    pd->last_event.xany.serial = 0;
+    pd->last_timestamp = 0;
+    _XtAllocTMContext(pd);
+    pd->mapping_callbacks = NULL;
+
+    pd->pdi.grabList = NULL;
+    pd->pdi.trace = NULL;
+    pd->pdi.traceDepth = 0;
+    pd->pdi.traceMax = 0;
+    pd->pdi.focusWidget = NULL;
+    pd->pdi.activatingKey = 0;
+    pd->pdi.keyboard.grabType = XtNoServerGrab;
+    pd->pdi.pointer.grabType  = XtNoServerGrab;
+    _XtAllocWWTable(pd);
+    pd->per_screen_db = (XrmDatabase *)__XtCalloc(ScreenCount(dpy),
+                                               sizeof(XrmDatabase));
+    pd->cmd_db = (XrmDatabase)NULL;
+    pd->server_db = (XrmDatabase)NULL;
+    pd->dispatcher_list = NULL;
+    pd->ext_select_list = NULL;
+    pd->ext_select_count = 0;
+    pd->hook_object = NULL;
+#if 0
+    pd->hook_object = _XtCreate("hooks", "Hooks", hookObjectClass,
+       (Widget)NULL, (Screen*)DefaultScreenOfDisplay(dpy),
+       (ArgList)NULL, 0, (XtTypedArgList)NULL, 0,
+       (ConstraintWidgetClass)NULL);
+#endif
+
+#ifndef X_NO_RESOURCE_CONFIGURATION_MANAGEMENT
+    pd->rcm_init = XInternAtom (dpy, RCM_INIT, 0);
+    pd->rcm_data = XInternAtom (dpy, RCM_DATA, 0);
+#endif
+
+    return pd;
+}
+
+Display *XtOpenDisplay(
+       XtAppContext app,
+       _Xconst char* displayName,
+       _Xconst char* applName,
+       _Xconst char* className,
+       XrmOptionDescRec *urlist,
+       Cardinal num_urs,
+       int *argc,
+       String *argv)
+{
+       Display *d;
+       XrmDatabase db = NULL;
+       XtPerDisplay pd;
+       String language = NULL;
+
+       LOCK_APP(app);
+       LOCK_PROCESS;
+       /* parse the command line for name, display, and/or language */
+       db = _XtPreparseCommandLine(urlist, num_urs, *argc, argv,
+                               (String *)&applName,
+                               (String *)(displayName ? NULL : &displayName),
+                               (app->process->globalLangProcRec.proc ?
+                               &language : NULL));
+       UNLOCK_PROCESS;
+       d = XOpenDisplay(displayName);
+
+       if (! applName && !(applName = getenv("RESOURCE_NAME"))) {
+           if (*argc > 0 && argv[0] && *argv[0]) {
+#ifdef WIN32
+               char *ptr = strrchr(argv[0], '\\');
+#else
+               char *ptr = strrchr(argv[0], '/');
+#endif
+#ifdef __UNIXOS2__
+               char *dot_ptr,*ptr2;
+               ptr2 = strrchr(argv[0],'\\');
+               if (ptr2 > ptr) ptr = ptr2;
+               dot_ptr = strrchr(argv[0],'.');
+               if (dot_ptr && (dot_ptr > ptr)) *dot_ptr='\0';
+#endif  /* This will remove the .exe suffix under OS/2 */
+
+               if (ptr) applName = ++ptr;
+               else applName = argv[0];
+           } else
+               applName = "main";
+       }
+
+       if (d) {
+           pd = InitPerDisplay(d, app, applName, className);
+           pd->language = language;
+           _XtDisplayInitialize(d, pd, applName, urlist, num_urs, argc, argv);
+       } else {
+           int len;
+           displayName = XDisplayName(displayName);
+           len = strlen (displayName);
+           app->display_name_tried = (String) __XtMalloc (len + 1);
+           strncpy ((char*) app->display_name_tried, displayName, len + 1);
+           app->display_name_tried[len] = '\0';
+       }
+       if (db) XrmDestroyDatabase(db);
+       UNLOCK_APP(app);
+       return d;
+}
+
+Display *
+_XtAppInit(
+       XtAppContext * app_context_return,
+       String application_class,
+       XrmOptionDescRec *options,
+       Cardinal num_options,
+       int *argc_in_out,
+       String **argv_in_out,
+       String * fallback_resources)
+{
+    String *saved_argv;
+    int i;
+    Display *dpy;
+
+/*
+ * Save away argv and argc so we can set the properties later
+ */
+
+    saved_argv = (String *)
+       __XtMalloc( (Cardinal)((*argc_in_out + 1) * sizeof(String)) );
+
+    for (i = 0 ; i < *argc_in_out ; i++) saved_argv[i] = (*argv_in_out)[i];
+    saved_argv[i] = NULL;      /* NULL terminate that sucker. */
+
+
+    *app_context_return = XtCreateApplicationContext();
+
+    LOCK_APP((*app_context_return));
+    if (fallback_resources) /* save a procedure call */
+       XtAppSetFallbackResources(*app_context_return, fallback_resources);
+
+    dpy = XtOpenDisplay(*app_context_return, (String) NULL, NULL,
+                       application_class,
+                       options, num_options, argc_in_out, *argv_in_out);
+
+    if (!dpy) {
+       String param = (*app_context_return)->display_name_tried;
+       Cardinal param_count = 1;
+       XtErrorMsg("invalidDisplay","xtInitialize",XtCXtToolkitError,
+                   "Can't open display: %s", &param, &param_count);
+       XtFree((char *) (*app_context_return)->display_name_tried);
+    }
+    *argv_in_out = saved_argv;
+    UNLOCK_APP((*app_context_return));
+    return dpy;
+}
+
+void
+XtDisplayInitialize(
+       XtAppContext app,
+       Display *dpy,
+       _Xconst char* name,
+       _Xconst char* classname,
+       XrmOptionDescRec *urlist,
+       Cardinal num_urs,
+       int *argc,
+       String *argv
+       )
+{
+    XtPerDisplay pd;
+    XrmDatabase db = NULL;
+
+    LOCK_APP(app);
+    pd = InitPerDisplay(dpy, app, name, classname);
+    LOCK_PROCESS;
+    if (app->process->globalLangProcRec.proc)
+       /* pre-parse the command line for the language resource */
+       db = _XtPreparseCommandLine(urlist, num_urs, *argc, argv, NULL, NULL,
+                                   &pd->language);
+    UNLOCK_PROCESS;
+    _XtDisplayInitialize(dpy, pd, name, urlist, num_urs, argc, argv);
+    if (db) XrmDestroyDatabase(db);
+    UNLOCK_APP(app);
+}
+
+XtAppContext XtCreateApplicationContext(void)
+{
+       XtAppContext app = XtNew(XtAppStruct);
+#ifdef XTHREADS
+       app->lock_info = NULL;
+       app->lock = NULL;
+       app->unlock = NULL;
+       app->yield_lock = NULL;
+       app->restore_lock = NULL;
+       app->free_lock = NULL;
+#endif
+       INIT_APP_LOCK(app);
+       LOCK_APP(app);
+       LOCK_PROCESS;
+       app->process = _XtGetProcessContext();
+       app->next = app->process->appContextList;
+       app->process->appContextList = app;
+       app->langProcRec.proc = app->process->globalLangProcRec.proc;
+       app->langProcRec.closure = app->process->globalLangProcRec.closure;
+       app->destroy_callbacks = NULL;
+       app->list = NULL;
+       app->count = app->max = app->last = 0;
+       app->timerQueue = NULL;
+       app->workQueue = NULL;
+       app->signalQueue = NULL;
+       app->input_list = NULL;
+       app->outstandingQueue = NULL;
+       app->errorDB = NULL;
+       _XtSetDefaultErrorHandlers(&app->errorMsgHandler,
+               &app->warningMsgHandler, &app->errorHandler,
+               &app->warningHandler);
+       app->action_table = NULL;
+       _XtSetDefaultSelectionTimeout(&app->selectionTimeout);
+       _XtSetDefaultConverterTable(&app->converterTable);
+       app->sync = app->being_destroyed = app->error_inited = FALSE;
+       app->in_phase2_destroy = NULL;
+#ifndef USE_POLL
+       FD_ZERO(&app->fds.rmask);
+       FD_ZERO(&app->fds.wmask);
+       FD_ZERO(&app->fds.emask);
+#endif
+       app->fds.nfds = 0;
+       app->input_count = app->input_max = 0;
+       _XtHeapInit(&app->heap);
+       app->fallback_resources = NULL;
+       _XtPopupInitialize(app);
+       app->action_hook_list = NULL;
+       app->block_hook_list = NULL;
+       app->destroy_list_size = app->destroy_count = app->dispatch_level = 0;
+       app->destroy_list = NULL;
+#ifndef NO_IDENTIFY_WINDOWS
+       app->identify_windows = False;
+#endif
+       app->free_bindings = NULL;
+       app->display_name_tried = NULL;
+       app->dpy_destroy_count = 0;
+       app->dpy_destroy_list = NULL;
+       app->exit_flag = FALSE;
+       app->rebuild_fdlist = TRUE;
+       UNLOCK_PROCESS;
+       UNLOCK_APP(app);
+       return app;
+}
+
+void XtAppSetExitFlag (
+    XtAppContext app)
+{
+    LOCK_APP(app);
+    app->exit_flag = TRUE;
+    UNLOCK_APP(app);
+}
+
+Boolean XtAppGetExitFlag (
+    XtAppContext app)
+{
+    Boolean retval;
+    LOCK_APP(app);
+    retval = app->exit_flag;
+    UNLOCK_APP(app);
+    return retval;
+}
+
+static void DestroyAppContext(XtAppContext app)
+{
+       XtAppContext* prev_app;
+
+       prev_app = &app->process->appContextList;
+       while (app->count-- > 0) XtCloseDisplay(app->list[app->count]);
+       if (app->list != NULL) XtFree((char *)app->list);
+       _XtFreeConverterTable(app->converterTable);
+       _XtCacheFlushTag(app, (XtPointer)&app->heap);
+       _XtFreeActions(app->action_table);
+       if (app->destroy_callbacks != NULL) {
+           XtCallCallbackList((Widget) NULL,
+                              (XtCallbackList)app->destroy_callbacks,
+                              (XtPointer)app);
+           _XtRemoveAllCallbacks(&app->destroy_callbacks);
+       }
+       while (app->timerQueue) XtRemoveTimeOut((XtIntervalId)app->timerQueue);
+       while (app->workQueue) XtRemoveWorkProc((XtWorkProcId)app->workQueue);
+       while (app->signalQueue) XtRemoveSignal((XtSignalId)app->signalQueue);
+       if (app->input_list) _XtRemoveAllInputs(app);
+       XtFree((char*)app->destroy_list);
+       _XtHeapFree(&app->heap);
+       while (*prev_app != app) prev_app = &(*prev_app)->next;
+       *prev_app = app->next;
+       if (app->process->defaultAppContext == app)
+           app->process->defaultAppContext = NULL;
+       if (app->free_bindings) _XtDoFreeBindings (app);
+       FREE_APP_LOCK(app);
+       XtFree((char *)app);
+}
+
+static XtAppContext* appDestroyList = NULL;
+int _XtAppDestroyCount = 0;
+
+void XtDestroyApplicationContext(XtAppContext app)
+{
+       LOCK_APP(app);
+       if (app->being_destroyed) {
+           UNLOCK_APP(app);
+           return;
+       }
+
+       if (_XtSafeToDestroy(app)) {
+           LOCK_PROCESS;
+           DestroyAppContext(app);
+           UNLOCK_PROCESS;
+       } else {
+           app->being_destroyed = TRUE;
+           LOCK_PROCESS;
+           _XtAppDestroyCount++;
+           appDestroyList =
+                   (XtAppContext *) XtRealloc((char *) appDestroyList,
+                   (unsigned) (_XtAppDestroyCount * sizeof(XtAppContext)));
+           appDestroyList[_XtAppDestroyCount-1] = app;
+           UNLOCK_PROCESS;
+           UNLOCK_APP(app);
+       }
+}
+
+void _XtDestroyAppContexts(void)
+{
+       int i,ii;
+       XtAppContext apps[8];
+       XtAppContext* pApps;
+
+       pApps = XtStackAlloc (sizeof (XtAppContext) * _XtAppDestroyCount, apps);
+
+       for (i = ii = 0; i < _XtAppDestroyCount; i++) {
+           if (_XtSafeToDestroy(appDestroyList[i]))
+               DestroyAppContext(appDestroyList[i]);
+           else
+               pApps[ii++] = appDestroyList[i];
+       }
+       _XtAppDestroyCount = ii;
+       if (_XtAppDestroyCount == 0) {
+           XtFree((char *) appDestroyList);
+           appDestroyList = NULL;
+       } else {
+           for (i = 0; i < ii; i++)
+               appDestroyList[i] = pApps[i];
+       }
+       XtStackFree ((XtPointer) pApps, apps);
+}
+
+XrmDatabase XtDatabase(Display *dpy)
+{
+    XrmDatabase retval;
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    retval = XrmGetDatabase(dpy);
+    UNLOCK_APP(app);
+    return retval;
+}
+
+PerDisplayTablePtr _XtperDisplayList = NULL;
+
+XtPerDisplay _XtSortPerDisplayList(Display *dpy)
+{
+       register PerDisplayTablePtr pd, opd = NULL;
+
+       LOCK_PROCESS;
+       for (pd = _XtperDisplayList;
+            pd != NULL && pd->dpy != dpy;
+            pd = pd->next) {
+           opd = pd;
+       }
+
+       if (pd == NULL) {
+           XtErrorMsg(XtNnoPerDisplay, "getPerDisplay", XtCXtToolkitError,
+                   "Couldn't find per display information",
+                   (String *) NULL, (Cardinal *)NULL);
+       }
+
+       if (pd != _XtperDisplayList) {  /* move it to the front */
+           /* opd points to the previous one... */
+
+           opd->next = pd->next;
+           pd->next = _XtperDisplayList;
+           _XtperDisplayList = pd;
+       }
+       UNLOCK_PROCESS;
+       return &(pd->perDpy);
+}
+
+XtAppContext XtDisplayToApplicationContext(Display *dpy)
+{
+       XtAppContext retval;
+
+       retval = _XtGetPerDisplay(dpy)->appContext;
+       return retval;
+}
+
+static void CloseDisplay(Display *dpy)
+{
+        register XtPerDisplay xtpd;
+       register PerDisplayTablePtr pd, opd = NULL;
+       XrmDatabase db;
+       int i;
+
+       XtDestroyWidget(XtHooksOfDisplay(dpy));
+
+       LOCK_PROCESS;
+       for (pd = _XtperDisplayList;
+            pd != NULL && pd->dpy != dpy;
+            pd = pd->next){
+           opd = pd;
+       }
+
+       if (pd == NULL) {
+           XtErrorMsg(XtNnoPerDisplay, "closeDisplay", XtCXtToolkitError,
+                   "Couldn't find per display information",
+                   (String *) NULL, (Cardinal *)NULL);
+       }
+
+       if (pd == _XtperDisplayList) _XtperDisplayList = pd->next;
+       else opd->next = pd->next;
+
+       xtpd = &(pd->perDpy);
+
+        if (xtpd != NULL) {
+           if (xtpd->destroy_callbacks != NULL) {
+               XtCallCallbackList((Widget) NULL,
+                                  (XtCallbackList)xtpd->destroy_callbacks,
+                                  (XtPointer)xtpd);
+               _XtRemoveAllCallbacks(&xtpd->destroy_callbacks);
+           }
+           if (xtpd->mapping_callbacks != NULL)
+               _XtRemoveAllCallbacks(&xtpd->mapping_callbacks);
+           XtDeleteFromAppContext(dpy, xtpd->appContext);
+           if (xtpd->keysyms)
+               XFree((char *) xtpd->keysyms);
+            XtFree((char *) xtpd->modKeysyms);
+            XtFree((char *) xtpd->modsToKeysyms);
+            xtpd->keysyms_per_keycode = 0;
+            xtpd->being_destroyed = FALSE;
+            xtpd->keysyms = NULL;
+            xtpd->modKeysyms = NULL;
+            xtpd->modsToKeysyms = NULL;
+           XDestroyRegion(xtpd->region);
+           _XtCacheFlushTag(xtpd->appContext, (XtPointer)&xtpd->heap);
+           _XtGClistFree(dpy, xtpd);
+           XtFree((char*)xtpd->pdi.trace);
+           _XtHeapFree(&xtpd->heap);
+           _XtFreeWWTable(xtpd);
+           xtpd->per_screen_db[DefaultScreen(dpy)] = (XrmDatabase)NULL;
+           for (i = ScreenCount(dpy); --i >= 0; ) {
+               db = xtpd->per_screen_db[i];
+               if (db)
+                   XrmDestroyDatabase(db);
+           }
+           XtFree((char *)xtpd->per_screen_db);
+           if ((db = XrmGetDatabase(dpy)))
+               XrmDestroyDatabase(db);
+           if (xtpd->cmd_db)
+               XrmDestroyDatabase(xtpd->cmd_db);
+           if (xtpd->server_db)
+               XrmDestroyDatabase(xtpd->server_db);
+           XtFree(xtpd->language);
+           if (xtpd->dispatcher_list != NULL)
+               XtFree((char *) xtpd->dispatcher_list);
+           if (xtpd->ext_select_list != NULL)
+               XtFree((char *) xtpd->ext_select_list);
+        }
+       XtFree((char*)pd);
+       XrmSetDatabase(dpy, (XrmDatabase)NULL);
+       XCloseDisplay(dpy);
+       UNLOCK_PROCESS;
+}
+
+void XtCloseDisplay(Display *dpy)
+{
+       XtPerDisplay pd;
+       XtAppContext app = XtDisplayToApplicationContext(dpy);
+
+       LOCK_APP(app);
+       pd = _XtGetPerDisplay(dpy);
+       if (pd->being_destroyed) {
+           UNLOCK_APP(app);
+           return;
+       }
+
+       if (_XtSafeToDestroy(app)) CloseDisplay(dpy);
+       else {
+           pd->being_destroyed = TRUE;
+           app->dpy_destroy_count++;
+           app->dpy_destroy_list = (Display **)
+               XtRealloc((char *) app->dpy_destroy_list,
+                   (unsigned) (app->dpy_destroy_count * sizeof(Display *)));
+           app->dpy_destroy_list[app->dpy_destroy_count-1] = dpy;
+       }
+       UNLOCK_APP(app);
+}
+
+void _XtCloseDisplays(XtAppContext app)
+{
+       int i;
+
+       LOCK_APP(app);
+       for (i = 0; i < app->dpy_destroy_count; i++) {
+           CloseDisplay(app->dpy_destroy_list[i]);
+       }
+       app->dpy_destroy_count = 0;
+       XtFree((char *) app->dpy_destroy_list);
+       app->dpy_destroy_list = NULL;
+       UNLOCK_APP(app);
+}
+
+XtAppContext XtWidgetToApplicationContext(Widget w)
+{
+       XtAppContext retval;
+
+       retval = _XtGetPerDisplay(XtDisplayOfObject(w))->appContext;
+       return retval;
+}
+
+
+void XtGetApplicationNameAndClass(
+    Display *dpy,
+    String *name_return,
+    String *class_return)
+{
+    XtPerDisplay pd;
+
+    pd = _XtGetPerDisplay(dpy);
+    *name_return = XrmQuarkToString(pd->name);
+    *class_return = XrmQuarkToString(pd->class);
+}
+
+XtPerDisplay _XtGetPerDisplay (Display* display)
+{
+    XtPerDisplay retval;
+
+    LOCK_PROCESS;
+    retval = ((_XtperDisplayList != NULL &&
+             _XtperDisplayList->dpy == display)
+             ? &_XtperDisplayList->perDpy
+             : _XtSortPerDisplayList(display));
+    UNLOCK_PROCESS;
+    return retval;
+}
+
+XtPerDisplayInputRec* _XtGetPerDisplayInput(Display* display)
+{
+    XtPerDisplayInputRec* retval;
+    LOCK_PROCESS;
+    retval = ((_XtperDisplayList != NULL &&
+             _XtperDisplayList->dpy == display)
+             ? &_XtperDisplayList->perDpy.pdi
+             : &_XtSortPerDisplayList(display)->pdi);
+    UNLOCK_PROCESS;
+    return retval;
+}
+
+void XtGetDisplays(
+    XtAppContext app_context,
+    Display*** dpy_return,
+    Cardinal* num_dpy_return)
+{
+    int ii;
+    LOCK_APP(app_context);
+    *num_dpy_return = app_context->count;
+    *dpy_return = (Display**)__XtMalloc(app_context->count * sizeof(Display*));
+    for (ii = 0; ii < app_context->count; ii++)
+       (*dpy_return)[ii] = app_context->list[ii];
+    UNLOCK_APP(app_context);
+}
diff --git a/src/Error.c b/src/Error.c
new file mode 100644 (file)
index 0000000..fc9b11a
--- /dev/null
@@ -0,0 +1,630 @@
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+/* The error handlers in the application context aren't used since we can't
+   come up with a uniform way of using them.  If you can, define
+   GLOBALERRORS to be FALSE (or 0). */
+
+#ifndef GLOBALERRORS
+#define GLOBALERRORS 1
+#endif
+
+static void InitErrorHandling(XrmDatabase *);
+#if GLOBALERRORS
+static XrmDatabase errorDB = NULL;
+static Boolean error_inited = FALSE;
+void _XtDefaultErrorMsg(String, String, String, String, String*, Cardinal*);
+void _XtDefaultWarningMsg(String, String, String, String, String*, Cardinal*);
+void _XtDefaultError(String);
+void _XtDefaultWarning(String);
+static XtErrorMsgHandler errorMsgHandler = _XtDefaultErrorMsg;
+static XtErrorMsgHandler warningMsgHandler = _XtDefaultWarningMsg;
+static XtErrorHandler errorHandler = _XtDefaultError;
+static XtErrorHandler warningHandler = _XtDefaultWarning;
+#endif /* GLOBALERRORS */
+
+XrmDatabase *XtGetErrorDatabase(void)
+{
+    XrmDatabase* retval;
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    retval = &errorDB;
+    UNLOCK_PROCESS;
+#else
+    retval = XtAppGetErrorDatabase(_XtDefaultAppContext());
+#endif /* GLOBALERRORS */
+    return retval;
+}
+
+XrmDatabase *XtAppGetErrorDatabase(
+       XtAppContext app)
+{
+    XrmDatabase* retval;
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    retval = &errorDB;
+    UNLOCK_PROCESS;
+#else
+    LOCK_APP(app);
+    retval= &app->errorDB;
+    UNLOCK_APP(app);
+#endif /* GLOBALERRORS */
+    return retval;
+}
+
+void XtGetErrorDatabaseText(
+    register _Xconst char* name,
+    register _Xconst char* type,
+    register _Xconst char* class,
+    _Xconst char* defaultp,
+    String buffer,
+    int nbytes)
+{
+#if GLOBALERRORS
+    XtAppGetErrorDatabaseText(NULL,
+           name,type,class,defaultp, buffer, nbytes, NULL);
+#else
+    XtAppGetErrorDatabaseText(_XtDefaultAppContext(),
+           name,type,class,defaultp, buffer, nbytes, NULL);
+#endif /* GLOBALERRORS */
+}
+
+void XtAppGetErrorDatabaseText(
+    XtAppContext app,
+    register _Xconst char* name,
+    register _Xconst char* type,
+    register _Xconst char* class,
+    _Xconst char* defaultp,
+    String buffer,
+    int nbytes,
+    XrmDatabase db)
+{
+    String str_class;
+    String type_str;
+    XrmValue result;
+    char *str_name = NULL;
+    char *temp = NULL;
+
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    if (error_inited == FALSE) {
+        InitErrorHandling (&errorDB);
+        error_inited = TRUE;
+    }
+#else
+    LOCK_APP(app);
+    if (app->error_inited == FALSE) {
+        InitErrorHandling (&app->errorDB);
+        app->error_inited = TRUE;
+    }
+#endif /* GLOBALERRORS */
+    if (!(str_name = ALLOCATE_LOCAL(strlen(name) + strlen(type) + 2)))
+       _XtAllocError(NULL);
+    (void) sprintf(str_name, "%s.%s", name, type);
+    /* XrmGetResource requires the name and class to be fully qualified
+     * and to have the same number of components. */
+    str_class = (char *)class;
+    if (! strchr(class, '.')) {
+       if (!(temp = ALLOCATE_LOCAL(2 * strlen(class) + 2)))
+           _XtAllocError(NULL);
+       (void) sprintf(temp, "%s.%s", class, class);
+       str_class = temp;
+    }
+    if (db == NULL) {
+#if GLOBALERRORS
+       (void) XrmGetResource(errorDB, str_name, str_class, &type_str,
+                             &result);
+#else
+       (void) XrmGetResource(app->errorDB, str_name, str_class, &type_str,
+                             &result);
+#endif /* GLOBALERRORS */
+    } else (void) XrmGetResource(db, str_name, str_class, &type_str, &result);
+    if (result.addr) {
+        (void) strncpy (buffer, result.addr, nbytes);
+        if (result.size > (unsigned) nbytes) buffer[nbytes-1] = 0;
+    } else {
+       int len = strlen(defaultp);
+       if (len >= nbytes) len = nbytes-1;
+       (void) memmove(buffer, defaultp, len);
+       buffer[len] = '\0';
+    }
+    if (str_name)
+       DEALLOCATE_LOCAL(str_name);
+    if (temp)
+       DEALLOCATE_LOCAL(temp);
+#if GLOBALERRORS
+    UNLOCK_PROCESS;
+#else
+    UNLOCK_APP(app);
+#endif
+}
+
+static void InitErrorHandling (
+    XrmDatabase *db)
+{
+    XrmDatabase errordb;
+
+    errordb = XrmGetFileDatabase(ERRORDB);
+    XrmMergeDatabases(errordb, db);
+}
+
+static void DefaultMsg (
+    String name,
+    String type,
+    String class,
+    String defaultp,
+    String* params,
+    Cardinal* num_params,
+    Bool error,
+    void (*fn)(_Xconst _XtString))
+{
+#define BIGBUF 1024
+    char buffer[BIGBUF];
+    char* message;
+    XtGetErrorDatabaseText(name,type,class,defaultp, buffer, BIGBUF);
+/*need better solution here, perhaps use lower level printf primitives? */
+    if (params == NULL || num_params == NULL || *num_params == 0)
+       (*fn)(buffer);
+#ifndef WIN32 /* and OS/2 */
+    else if ((getuid () != geteuid ()) || getuid() == 0) {
+       if ((error && errorHandler == _XtDefaultError) ||
+           (!error && warningHandler == _XtDefaultWarning)) {
+           /*
+            * if it's just going to go to stderr anyway, then we'll
+            * fprintf to stderr ourselves and skip the insecure sprintf.
+            */
+           Cardinal i = *num_params;
+           String par[10];
+           if (i > 10) i = 10;
+           (void) memmove((char*)par, (char*)params, i * sizeof(String) );
+           bzero( &par[i], (10-i) * sizeof(String) );
+           (void) fprintf (stderr, "%s%s",
+                           error ? XTERROR_PREFIX : XTWARNING_PREFIX,
+                           error ? "Error: " : "Warning: ");
+           (void) fprintf (stderr, buffer,
+                           par[0], par[1], par[2], par[3], par[4],
+                           par[5], par[6], par[7], par[8], par[9]);
+           (void) fprintf (stderr, "%c", '\n');
+           if (i != *num_params)
+               (*fn) ( "Some arguments in previous message were lost" );
+           else if (error) exit (1);
+       } else {
+           /*
+            * can't tell what it might do, so we'll play it safe
+            */
+           XtWarning ("\
+This program is an suid-root program or is being run by the root user.\n\
+The full text of the error or warning message cannot be safely formatted\n\
+in this environment. You may get a more descriptive message by running the\n\
+program as a non-root user or by removing the suid bit on the executable.");
+           (*fn)(buffer); /* if *fn is an ErrorHandler it should exit */
+       }
+    }
+#endif
+    else {
+       /*
+        * If you have snprintf the worst thing that could happen is you'd
+        * lose some information. Without snprintf you're probably going to
+        * scramble your heap and perhaps SEGV -- sooner or later.
+        * If it hurts when you go like this then don't go like this! :-)
+        */
+       Cardinal i = *num_params;
+       String par[10];
+       if (i > 10) i = 10;
+       (void) memmove((char*)par, (char*)params, i * sizeof(String) );
+       bzero( &par[i], (10-i) * sizeof(String) );
+       if (i != *num_params)
+           XtWarning( "Some arguments in following message were lost" );
+       /*
+        * resist any temptation you might have to make `message' a
+        * local buffer on the stack. Doing so is a security hole
+        * in programs executing as root. Error and Warning
+        * messages shouldn't be called frequently enough for this
+        * to be a performance issue.
+        */
+       if ((message = __XtMalloc (BIGBUF))) {
+           (void) snprintf (message, BIGBUF, buffer,
+                            par[0], par[1], par[2], par[3], par[4],
+                            par[5], par[6], par[7], par[8], par[9]);
+           (*fn)(message);
+           XtFree(message);
+       } else {
+           XtWarning ("Memory allocation failed, arguments in the following message were lost");
+           (*fn)(buffer);
+       }
+    }
+}
+
+void _XtDefaultErrorMsg (
+    String name,
+    String type,
+    String class,
+    String defaultp,
+    String* params,
+    Cardinal* num_params)
+{
+    DefaultMsg (name,type,class,defaultp,params,num_params,True,XtError);
+}
+
+void _XtDefaultWarningMsg (
+    String name,
+    String type,
+    String class,
+    String defaultp,
+    String* params,
+    Cardinal* num_params)
+{
+    DefaultMsg (name,type,class,defaultp,params,num_params,False,XtWarning);
+}
+
+void XtErrorMsg(
+    _Xconst char* name,
+    _Xconst char* type,
+    _Xconst char* class,
+    _Xconst char* defaultp,
+    String* params,
+    Cardinal* num_params)
+{
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    (*errorMsgHandler)((String)name,(String)type,(String)class,
+                      (String)defaultp,params,num_params);
+    UNLOCK_PROCESS;
+#else
+    XtAppErrorMsg(_XtDefaultAppContext(),name,type,class,
+           defaultp,params,num_params);
+#endif /* GLOBALERRORS */
+}
+
+void XtAppErrorMsg(
+    XtAppContext app,
+    _Xconst char* name,
+    _Xconst char* type,
+    _Xconst char* class,
+    _Xconst char* defaultp,
+    String* params,
+    Cardinal* num_params)
+{
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    (*errorMsgHandler)((String)name,(String)type,(String)class,
+                      (String)defaultp,params,num_params);
+    UNLOCK_PROCESS;
+#else
+    LOCK_APP(app);
+    (*app->errorMsgHandler)(name,type,class,defaultp,params,num_params);
+    UNLOCK_APP(app);
+#endif /* GLOBALERRORS */
+}
+
+void XtWarningMsg(
+    _Xconst char* name,
+    _Xconst char* type,
+    _Xconst char* class,
+    _Xconst char* defaultp,
+    String* params,
+    Cardinal* num_params)
+{
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    (*warningMsgHandler)((String)name,(String)type,(String)class,
+                        (String)defaultp,params,num_params);
+    UNLOCK_PROCESS;
+#else
+    XtAppWarningMsg(_XtDefaultAppContext(),name,type,class,
+           defaultp,params,num_params);
+#endif /* GLOBALERRORS */
+}
+
+void XtAppWarningMsg(
+    XtAppContext app,
+    _Xconst char* name,
+    _Xconst char* type,
+    _Xconst char* class,
+    _Xconst char* defaultp,
+    String* params,
+    Cardinal* num_params)
+{
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    (*warningMsgHandler)((String)name,(String)type,(String)class,
+                        (String)defaultp,params,num_params);
+    UNLOCK_PROCESS;
+#else
+    LOCK_APP(app);
+    (*app->warningMsgHandler)(name,type,class,defaultp,params,num_params);
+    UNLOCK_APP(app);
+#endif /* GLOBALERRORS */
+}
+
+void XtSetErrorMsgHandler(
+    XtErrorMsgHandler handler)
+{
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    if (handler != NULL) errorMsgHandler = handler;
+    else errorMsgHandler  = _XtDefaultErrorMsg;
+    UNLOCK_PROCESS;
+#else
+    XtAppSetErrorMsgHandler(_XtDefaultAppContext(), handler);
+#endif /* GLOBALERRORS */
+}
+
+XtErrorMsgHandler XtAppSetErrorMsgHandler(
+    XtAppContext app,
+    XtErrorMsgHandler handler)
+{
+    XtErrorMsgHandler old;
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    old = errorMsgHandler;
+    if (handler != NULL) errorMsgHandler = handler;
+    else errorMsgHandler  = _XtDefaultErrorMsg;
+    UNLOCK_PROCESS;
+#else
+    LOCK_APP(app);
+    old = app->errorMsgHandler;
+    if (handler != NULL) app->errorMsgHandler = handler;
+    else app->errorMsgHandler  = _XtDefaultErrorMsg;
+    UNLOCK_APP(app);
+#endif /* GLOBALERRORS */
+    return old;
+}
+
+void XtSetWarningMsgHandler(
+    XtErrorMsgHandler handler)
+{
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    if (handler != NULL) warningMsgHandler  = handler;
+    else warningMsgHandler = _XtDefaultWarningMsg;
+    UNLOCK_PROCESS;
+#else
+    XtAppSetWarningMsgHandler(_XtDefaultAppContext(),handler);
+#endif /* GLOBALERRORS */
+}
+
+XtErrorMsgHandler XtAppSetWarningMsgHandler(
+    XtAppContext app,
+    XtErrorMsgHandler handler)
+{
+    XtErrorMsgHandler old;
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    old = warningMsgHandler;
+    if (handler != NULL) warningMsgHandler  = handler;
+    else warningMsgHandler = _XtDefaultWarningMsg;
+    UNLOCK_PROCESS;
+#else
+    LOCK_APP(app);
+    old = app->warningMsgHandler;
+    if (handler != NULL) app->warningMsgHandler  = handler;
+    else app->warningMsgHandler = _XtDefaultWarningMsg;
+    UNLOCK_APP(app);
+#endif /* GLOBALERRORS */
+    return old;
+}
+
+void _XtDefaultError(String message)
+{
+    if (message && *message)
+       (void)fprintf(stderr, "%sError: %s\n", XTERROR_PREFIX, message);
+    exit(1);
+}
+
+void _XtDefaultWarning(String message)
+{
+    if (message && *message)
+       (void)fprintf(stderr, "%sWarning: %s\n", XTWARNING_PREFIX, message);
+    return;
+}
+
+void XtError(
+    _Xconst char* message)
+{
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    (*errorHandler)((String)message);
+    UNLOCK_PROCESS;
+#else
+    XtAppError(_XtDefaultAppContext(),message);
+#endif /* GLOBALERRORS */
+}
+
+void XtAppError(
+    XtAppContext app,
+    _Xconst char* message)
+{
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    (*errorHandler)((String)message);
+    UNLOCK_PROCESS;
+#else
+    LOCK_APP(app);
+    (*app->errorHandler)(message);
+    UNLOCK_APP(app);
+#endif /* GLOBALERRORS */
+}
+
+void XtWarning(
+    _Xconst char* message)
+{
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    (*warningHandler)((String)message);
+    UNLOCK_PROCESS;
+#else
+    XtAppWarning(_XtDefaultAppContext(),message);
+#endif /* GLOBALERRORS */
+}
+
+void XtAppWarning(
+    XtAppContext app,
+    _Xconst char* message)
+{
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    (*warningHandler)((String)message);
+    UNLOCK_PROCESS;
+#else
+    LOCK_APP(app);
+    (*app->warningHandler)(message);
+    UNLOCK_APP(app);
+#endif /* GLOBALERRORS */
+}
+
+void XtSetErrorHandler(XtErrorHandler handler)
+{
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    if (handler != NULL) errorHandler = handler;
+    else errorHandler  = _XtDefaultError;
+    UNLOCK_PROCESS;
+#else
+    XtAppSetErrorHandler(_XtDefaultAppContext(),handler);
+#endif /* GLOBALERRORS */
+}
+
+XtErrorHandler XtAppSetErrorHandler(
+    XtAppContext app,
+    XtErrorHandler handler)
+{
+    XtErrorHandler old;
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    old = errorHandler;
+    if (handler != NULL) errorHandler = handler;
+    else errorHandler  = _XtDefaultError;
+    UNLOCK_PROCESS;
+#else
+    LOCK_APP(app);
+    old = app->errorHandler;
+    if (handler != NULL) app->errorHandler = handler;
+    else app->errorHandler  = _XtDefaultError;
+    UNLOCK_APP(app);
+#endif /* GLOBALERRORS */
+    return old;
+}
+
+void XtSetWarningHandler(XtErrorHandler handler)
+{
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    if (handler != NULL) warningHandler = handler;
+    else warningHandler = _XtDefaultWarning;
+    UNLOCK_PROCESS;
+#else
+    XtAppSetWarningHandler(_XtDefaultAppContext(),handler);
+#endif /* GLOBALERRORS */
+}
+
+XtErrorHandler XtAppSetWarningHandler(
+    XtAppContext app,
+    XtErrorHandler handler)
+{
+    XtErrorHandler old;
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    old = warningHandler;
+    if (handler != NULL) warningHandler  = handler;
+    else warningHandler = _XtDefaultWarning;
+    UNLOCK_PROCESS;
+#else
+    LOCK_APP(app);
+    old = app->warningHandler;
+    if (handler != NULL) app->warningHandler  = handler;
+    else app->warningHandler = _XtDefaultWarning;
+    UNLOCK_APP(app);
+#endif /* GLOBALERRORS */
+    return old;
+}
+
+void _XtSetDefaultErrorHandlers(
+    XtErrorMsgHandler *errMsg,
+    XtErrorMsgHandler *warnMsg,
+    XtErrorHandler *err,
+    XtErrorHandler *warn)
+{
+#ifndef GLOBALERRORS
+    LOCK_PROCESS;
+    *errMsg = _XtDefaultErrorMsg;
+    *warnMsg = _XtDefaultWarningMsg;
+    *err = _XtDefaultError;
+    *warn = _XtDefaultWarning;
+    UNLOCK_PROCESS;
+#endif /* GLOBALERRORS */
+}
diff --git a/src/Event.c b/src/Event.c
new file mode 100644 (file)
index 0000000..11823d6
--- /dev/null
@@ -0,0 +1,1733 @@
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "Shell.h"
+#include "StringDefs.h"
+
+typedef struct _XtEventRecExt {
+    int type;
+    XtPointer select_data[1]; /* actual dimension is [mask] */
+} XtEventRecExt;
+
+#define EXT_TYPE(p) (((XtEventRecExt*) ((p)+1))->type)
+#define EXT_SELECT_DATA(p,n) (((XtEventRecExt*) ((p)+1))->select_data[n])
+
+#define NonMaskableMask ((EventMask)0x80000000L)
+
+/*
+ * These are definitions to make the code that handles exposure compresssion
+ * easier to read.
+ *
+ * COMP_EXPOSE      - The compression exposure field of "widget"
+ * COMP_EXPOSE_TYPE - The type of compression (lower 4 bits of COMP_EXPOSE.
+ * GRAPHICS_EXPOSE  - TRUE if the widget wants graphics expose events
+ *                    dispatched.
+ * NO_EXPOSE        - TRUE if the widget wants No expose events dispatched.
+ */
+
+#define COMP_EXPOSE   (widget->core.widget_class->core_class.compress_exposure)
+#define COMP_EXPOSE_TYPE (COMP_EXPOSE & 0x0f)
+#define GRAPHICS_EXPOSE  ((XtExposeGraphicsExpose & COMP_EXPOSE) || \
+                         (XtExposeGraphicsExposeMerged & COMP_EXPOSE))
+#define NO_EXPOSE        (XtExposeNoExpose & COMP_EXPOSE)
+
+EventMask XtBuildEventMask(
+    Widget widget)
+{
+    XtEventTable ev;
+    EventMask  mask = 0L;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    for (ev = widget->core.event_table; ev != NULL; ev = ev->next)
+       if (ev->select) {
+           if (!ev->has_type_specifier)
+               mask |= ev->mask;
+           else {
+               if (EXT_TYPE(ev) < LASTEvent) {
+                   Cardinal i;
+                   for (i = 0; i < ev->mask; i++)
+                       if (EXT_SELECT_DATA(ev, i))
+                           mask |= *(EventMask*)EXT_SELECT_DATA(ev, i);
+               }
+           }
+       }
+    LOCK_PROCESS;
+    if (widget->core.widget_class->core_class.expose != NULL)
+       mask |= ExposureMask;
+    if (widget->core.widget_class->core_class.visible_interest)
+       mask |= VisibilityChangeMask;
+    UNLOCK_PROCESS;
+    if (widget->core.tm.translations)
+       mask |= widget->core.tm.translations->eventMask;
+
+    mask =  mask & ~NonMaskableMask;
+    UNLOCK_APP(app);
+    return mask;
+}
+
+static void CallExtensionSelector(
+    Widget widget,
+    ExtSelectRec* rec,
+    Boolean forceCall)
+{
+    XtEventRec* p;
+    XtPointer* data;
+    int* types;
+    Cardinal i, count = 0;
+
+    for (p = widget->core.event_table; p != NULL; p = p->next)
+       if (p->has_type_specifier &&
+           EXT_TYPE(p) >= rec->min && EXT_TYPE(p) <= rec->max)
+           count += p->mask;
+
+    if (count == 0 && !forceCall) return;
+
+    data = (XtPointer *) ALLOCATE_LOCAL(count * sizeof (XtPointer));
+    types = (int *) ALLOCATE_LOCAL(count * sizeof (int));
+    count = 0;
+
+    for (p = widget->core.event_table; p != NULL; p = p->next)
+       if (p->has_type_specifier &&
+           EXT_TYPE(p) >= rec->min && EXT_TYPE(p) <= rec->max)
+           for (i =0; i < p->mask; i++) {
+               types[count] = EXT_TYPE(p);
+               data[count++] = EXT_SELECT_DATA(p, i);
+           }
+
+    (*rec->proc)(widget, types, data, count, rec->client_data);
+    DEALLOCATE_LOCAL((char*) types);
+    DEALLOCATE_LOCAL((char*) data);
+}
+
+static void
+RemoveEventHandler(
+    Widget widget,
+    XtPointer select_data,
+    int type,
+    Boolean has_type_specifier,
+    Boolean other,
+    XtEventHandler proc,
+    XtPointer closure,
+    Boolean raw)
+{
+    XtEventRec *p, **pp;
+    EventMask eventMask, oldMask = XtBuildEventMask(widget);
+
+    if (raw) raw = 1;
+    pp = &widget->core.event_table;
+    while ((p = *pp) &&
+          (p->proc != proc || p->closure != closure || p->select == raw ||
+           has_type_specifier != p->has_type_specifier ||
+           (has_type_specifier && EXT_TYPE(p) != type)))
+       pp = &p->next;
+    if (!p) return;
+
+    /* un-register it */
+    if (!has_type_specifier) {
+       eventMask = *(EventMask*)select_data;
+       eventMask &= ~NonMaskableMask;
+       if (other)
+           eventMask |= NonMaskableMask;
+       p->mask &= ~eventMask;
+    } else {
+       Cardinal i;
+       /* p->mask specifies count of EXT_SELECT_DATA(p,i)
+        * search through the list of selection data, if not found
+        * dont remove this handler
+        */
+       for (i = 0; i < p->mask && select_data != EXT_SELECT_DATA(p,i);) i++;
+       if (i == p->mask) return;
+       if (p->mask == 1) p->mask = 0;
+       else {
+           p->mask--;
+           while (i < p->mask) {
+               EXT_SELECT_DATA(p,i) = EXT_SELECT_DATA(p, i+1);
+               i++;
+           }
+       }
+    }
+
+    if (!p->mask) {        /* delete it entirely */
+        *pp = p->next;
+       XtFree((char *)p);
+    }
+
+    /* Reset select mask if realized and not raw. */
+    if ( !raw && XtIsRealized(widget) && !widget->core.being_destroyed) {
+       EventMask mask = XtBuildEventMask(widget);
+       Display* dpy = XtDisplay (widget);
+
+       if (oldMask != mask)
+           XSelectInput(dpy, XtWindow(widget), mask);
+
+       if (has_type_specifier) {
+           XtPerDisplay pd = _XtGetPerDisplay(dpy);
+           int i;
+           for (i = 0; i < pd->ext_select_count; i++) {
+               if (type >= pd->ext_select_list[i].min &&
+                   type <= pd->ext_select_list[i].max) {
+                   CallExtensionSelector(widget, pd->ext_select_list+i, TRUE);
+                   break;
+               }
+               if (type < pd->ext_select_list[i].min) break;
+           }
+       }
+    }
+}
+
+/*     Function Name: AddEventHandler
+ *     Description: An Internal routine that does the actual work of
+ *                   adding the event handlers.
+ *     Arguments: widget - widget to register an event handler for.
+ *                 eventMask - events to mask for.
+ *                 other - pass non maskable events to this proceedure.
+ *                 proc - proceedure to register.
+ *                 closure - data to pass to the event hander.
+ *                 position - where to add this event handler.
+ *                 force_new_position - If the element is already in the
+ *                                      list, this will force it to the
+ *                                      beginning or end depending on position.
+ *                 raw - If FALSE call XSelectInput for events in mask.
+ *     Returns: none
+ */
+
+static void
+AddEventHandler(
+    Widget widget,
+    XtPointer select_data,
+    int type,
+    Boolean         has_type_specifier,
+    Boolean         other,
+    XtEventHandler  proc,
+    XtPointer  closure,
+    XtListPosition  position,
+    Boolean         force_new_position,
+    Boolean         raw)
+{
+    register XtEventRec *p, **pp;
+    EventMask oldMask = 0, eventMask = 0;
+
+    if (!has_type_specifier) {
+       eventMask = *(EventMask*)select_data & ~NonMaskableMask;
+       if (other) eventMask |= NonMaskableMask;
+       if (!eventMask) return;
+    } else if (!type) return;
+
+    if (XtIsRealized(widget) && !raw) oldMask = XtBuildEventMask(widget);
+
+    if (raw) raw = 1;
+    pp = &widget->core.event_table;
+    while ((p = *pp) &&
+          (p->proc != proc || p->closure != closure || p->select == raw ||
+           has_type_specifier != p->has_type_specifier ||
+           (has_type_specifier && EXT_TYPE(p) != type)))
+       pp = &p->next;
+
+    if (!p) {                          /* New proc to add to list */
+       if (has_type_specifier) {
+           p = (XtEventRec*) __XtMalloc(sizeof(XtEventRec) +
+                                      sizeof(XtEventRecExt));
+           EXT_TYPE(p) = type;
+           EXT_SELECT_DATA(p,0) = select_data;
+           p->mask = 1;
+           p->has_type_specifier = True;
+       } else {
+           p = (XtEventRec*) __XtMalloc(sizeof(XtEventRec));
+           p->mask = eventMask;
+           p->has_type_specifier = False;
+       }
+       p->proc = proc;
+       p->closure = closure;
+       p->select = ! raw;
+
+       if (position == XtListHead) {
+           p->next = widget->core.event_table;
+           widget->core.event_table = p;
+           pp = &widget->core.event_table;
+       } else {
+           *pp = p;
+           p->next = NULL;
+       }
+    }
+    else {
+       if (force_new_position) {
+           *pp = p->next;
+
+           if (position == XtListHead) {
+               p->next = widget->core.event_table;
+               widget->core.event_table = p;
+           } else {
+               /*
+                * Find the last element in the list.
+                */
+               while (*pp)
+                   pp = &(*pp)->next;
+               *pp = p;
+               p->next = NULL;
+           }
+       }
+
+       if (!has_type_specifier)
+           p->mask |= eventMask;
+       else {
+           Cardinal i;
+           /* p->mask specifies count of EXT_SELECT_DATA(p,i) */
+           for (i = 0; i < p->mask && select_data != EXT_SELECT_DATA(p,i); )
+               i++;
+           if (i == p->mask) {
+               p = (XtEventRec*) XtRealloc((char*)p,
+                                           sizeof(XtEventRec) +
+                                           sizeof(XtEventRecExt) +
+                                           p->mask * sizeof(XtPointer));
+               EXT_SELECT_DATA(p,i) = select_data;
+               p->mask++;
+               *pp = p;
+           }
+       }
+    }
+
+    if (XtIsRealized(widget) && !raw) {
+       EventMask mask = XtBuildEventMask(widget);
+       Display* dpy = XtDisplay (widget);
+
+       if (oldMask != mask)
+           XSelectInput(dpy, XtWindow(widget), mask);
+
+       if (has_type_specifier) {
+           XtPerDisplay pd = _XtGetPerDisplay (dpy);
+           int i;
+           for (i = 0; i < pd->ext_select_count; i++) {
+               if (type >= pd->ext_select_list[i].min &&
+                   type <= pd->ext_select_list[i].max) {
+                   CallExtensionSelector(widget, pd->ext_select_list+i, FALSE);
+                   break;
+               }
+               if (type < pd->ext_select_list[i].min) break;
+           }
+       }
+    }
+}
+
+void XtRemoveEventHandler(
+    Widget         widget,
+    EventMask       eventMask,
+    _XtBoolean     other,
+    XtEventHandler  proc,
+    XtPointer      closure)
+{
+    WIDGET_TO_APPCON(widget);
+    LOCK_APP(app);
+    RemoveEventHandler(widget, (XtPointer) &eventMask, 0, FALSE,
+                      other, proc, closure, FALSE);
+    UNLOCK_APP(app);
+}
+
+void XtAddEventHandler(
+    Widget         widget,
+    EventMask       eventMask,
+    _XtBoolean      other,
+    XtEventHandler  proc,
+    XtPointer      closure)
+{
+    WIDGET_TO_APPCON(widget);
+    LOCK_APP(app);
+    AddEventHandler(widget, (XtPointer) &eventMask, 0, FALSE, other,
+                   proc, closure, XtListTail, FALSE, FALSE);
+    UNLOCK_APP(app);
+}
+
+void XtInsertEventHandler(
+    Widget         widget,
+    EventMask       eventMask,
+    _XtBoolean      other,
+    XtEventHandler  proc,
+    XtPointer      closure,
+    XtListPosition  position)
+{
+    WIDGET_TO_APPCON(widget);
+    LOCK_APP(app);
+    AddEventHandler(widget, (XtPointer) &eventMask, 0, FALSE, other,
+                   proc, closure, position, TRUE, FALSE);
+    UNLOCK_APP(app);
+}
+
+void XtRemoveRawEventHandler(
+    Widget         widget,
+    EventMask       eventMask,
+    _XtBoolean     other,
+    XtEventHandler  proc,
+    XtPointer      closure)
+{
+    WIDGET_TO_APPCON(widget);
+    LOCK_APP(app);
+    RemoveEventHandler(widget, (XtPointer) &eventMask, 0, FALSE,
+                      other, proc, closure, TRUE);
+    UNLOCK_APP(app);
+}
+
+void XtInsertRawEventHandler(
+    Widget         widget,
+    EventMask       eventMask,
+    _XtBoolean     other,
+    XtEventHandler  proc,
+    XtPointer      closure,
+    XtListPosition  position)
+{
+    WIDGET_TO_APPCON(widget);
+    LOCK_APP(app);
+    AddEventHandler(widget, (XtPointer) &eventMask, 0, FALSE, other,
+                   proc, closure, position, TRUE, TRUE);
+    UNLOCK_APP(app);
+}
+
+void XtAddRawEventHandler(
+    Widget         widget,
+    EventMask       eventMask,
+    _XtBoolean      other,
+    XtEventHandler  proc,
+    XtPointer      closure)
+{
+    WIDGET_TO_APPCON(widget);
+    LOCK_APP(app);
+    AddEventHandler(widget, (XtPointer) &eventMask, 0, FALSE, other,
+                   proc, closure, XtListTail, FALSE, TRUE);
+    UNLOCK_APP(app);
+}
+
+void XtRemoveEventTypeHandler(
+    Widget         widget,
+    int                    type,
+    XtPointer      select_data,
+    XtEventHandler  proc,
+    XtPointer      closure)
+{
+    WIDGET_TO_APPCON(widget);
+    LOCK_APP(app);
+    RemoveEventHandler(widget, select_data, type, TRUE,
+                      FALSE, proc, closure, FALSE);
+    UNLOCK_APP(app);
+}
+
+void XtInsertEventTypeHandler(
+    Widget         widget,
+    int                    type,
+    XtPointer      select_data,
+    XtEventHandler  proc,
+    XtPointer      closure,
+    XtListPosition  position)
+{
+    WIDGET_TO_APPCON(widget);
+    LOCK_APP(app);
+    AddEventHandler(widget, select_data, type, TRUE, FALSE,
+                   proc, closure, position, TRUE, FALSE);
+    UNLOCK_APP(app);
+}
+
+typedef struct _WWPair {
+    struct _WWPair *next;
+    Window window;
+    Widget widget;
+} *WWPair;
+
+typedef struct _WWTable {
+    unsigned int mask;         /* size of hash table - 1 */
+    unsigned int rehash;       /* mask - 2 */
+    unsigned int occupied;     /* number of occupied entries */
+    unsigned int fakes;                /* number occupied by WWfake */
+    Widget *entries;           /* the entries */
+    WWPair pairs;              /* bogus entries */
+} *WWTable;
+
+static const WidgetRec WWfake; /* placeholder for deletions */
+
+#define WWHASH(tab,win) ((win) & tab->mask)
+#define WWREHASHVAL(tab,win) ((((win) % tab->rehash) + 2) | 1)
+#define WWREHASH(tab,idx,rehash) ((idx + rehash) & tab->mask)
+#define WWTABLE(display) (_XtGetPerDisplay(display)->WWtable)
+
+static void ExpandWWTable(WWTable);
+
+void XtRegisterDrawable(
+    Display* display,
+    Drawable drawable,
+    Widget widget)
+{
+    WWTable tab;
+    int idx, rehash;
+    Widget entry;
+    Window window = (Window) drawable;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    tab = WWTABLE(display);
+    if (window != XtWindow(widget)) {
+       WWPair pair;
+       pair = XtNew(struct _WWPair);
+       pair->next = tab->pairs;
+       pair->window = window;
+       pair->widget = widget;
+       tab->pairs = pair;
+       UNLOCK_PROCESS;
+       UNLOCK_APP(app);
+       return;
+    }
+    if ((tab->occupied + (tab->occupied >> 2)) > tab->mask)
+       ExpandWWTable(tab);
+
+    idx = WWHASH(tab, window);
+    if ((entry = tab->entries[idx]) && entry != &WWfake) {
+       rehash = WWREHASHVAL(tab, window);
+       do {
+           idx = WWREHASH(tab, idx, rehash);
+       } while ((entry = tab->entries[idx]) && entry != &WWfake);
+    }
+    if (!entry)
+       tab->occupied++;
+    else if (entry == &WWfake)
+       tab->fakes--;
+    tab->entries[idx] = widget;
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+}
+
+void XtUnregisterDrawable(
+    Display* display,
+    Drawable drawable)
+{
+    WWTable tab;
+    int idx, rehash;
+    Widget entry;
+    Window window = (Window) drawable;
+    Widget widget = XtWindowToWidget (display, window);
+    DPY_TO_APPCON(display);
+
+    if (widget == NULL) return;
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    tab = WWTABLE(display);
+    if (window != XtWindow(widget)) {
+       WWPair *prev, pair;
+
+       prev = &tab->pairs;
+       while ((pair = *prev) && pair->window != window)
+           prev = &pair->next;
+       if (pair) {
+           *prev = pair->next;
+           XtFree((char *)pair);
+       }
+       UNLOCK_PROCESS;
+       UNLOCK_APP(app);
+       return;
+    }
+    idx = WWHASH(tab, window);
+    if ((entry = tab->entries[idx])) {
+       if (entry != widget) {
+           rehash = WWREHASHVAL(tab, window);
+           do {
+               idx = WWREHASH(tab, idx, rehash);
+               if (!(entry = tab->entries[idx])) {
+                   UNLOCK_PROCESS;
+                   UNLOCK_APP(app);
+                   return;
+               }
+           } while (entry != widget);
+       }
+       tab->entries[idx] = (Widget)&WWfake;
+       tab->fakes++;
+    }
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+}
+
+static void ExpandWWTable(
+    register WWTable tab)
+{
+    unsigned int oldmask;
+    register Widget *oldentries, *entries;
+    register Cardinal oldidx, newidx, rehash;
+    register Widget entry;
+
+    LOCK_PROCESS;
+    oldmask = tab->mask;
+    oldentries = tab->entries;
+    tab->occupied -= tab->fakes;
+    tab->fakes = 0;
+    if ((tab->occupied + (tab->occupied >> 2)) > tab->mask) {
+       tab->mask = (tab->mask << 1) + 1;
+       tab->rehash = tab->mask - 2;
+    }
+    entries = tab->entries = (Widget *) __XtCalloc(tab->mask+1, sizeof(Widget));
+    for (oldidx = 0; oldidx <= oldmask; oldidx++) {
+       if ((entry = oldentries[oldidx]) && entry != &WWfake) {
+           newidx = WWHASH(tab, XtWindow(entry));
+           if (entries[newidx]) {
+               rehash = WWREHASHVAL(tab, XtWindow(entry));
+               do {
+                   newidx = WWREHASH(tab, newidx, rehash);
+               } while (entries[newidx]);
+           }
+           entries[newidx] = entry;
+       }
+    }
+    XtFree((char *)oldentries);
+    UNLOCK_PROCESS;
+}
+
+Widget XtWindowToWidget(
+    register Display *display,
+    register Window window)
+{
+    register WWTable tab;
+    register int idx, rehash;
+    register Widget entry;
+    WWPair pair;
+    DPY_TO_APPCON(display);
+
+    if (!window) return NULL;
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    tab = WWTABLE(display);
+    idx = WWHASH(tab, window);
+    if ((entry = tab->entries[idx]) && XtWindow(entry) != window) {
+       rehash = WWREHASHVAL(tab, window);
+       do {
+           idx = WWREHASH(tab, idx, rehash);
+       } while ((entry = tab->entries[idx]) && XtWindow(entry) != window);
+    }
+    if (entry) {
+       UNLOCK_PROCESS;
+       UNLOCK_APP(app);
+       return entry;
+    }
+    for (pair = tab->pairs; pair; pair = pair->next) {
+       if (pair->window == window) {
+           entry = pair->widget;
+           UNLOCK_PROCESS;
+           UNLOCK_APP(app);
+           return entry;
+       }
+    }
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+    return NULL;
+}
+
+void _XtAllocWWTable(
+    XtPerDisplay pd)
+{
+    register WWTable tab;
+
+    tab = (WWTable) __XtMalloc(sizeof(struct _WWTable));
+    tab->mask = 0x7f;
+    tab->rehash = tab->mask - 2;
+    tab->entries = (Widget *) __XtCalloc(tab->mask+1, sizeof(Widget));
+    tab->occupied = 0;
+    tab->fakes = 0;
+    tab->pairs = NULL;
+    pd->WWtable = tab;
+}
+
+void _XtFreeWWTable(
+    register XtPerDisplay pd)
+{
+    register WWPair pair, next;
+
+    for (pair = pd->WWtable->pairs; pair; pair = next) {
+       next = pair->next;
+       XtFree((char *)pair);
+    }
+    XtFree((char *)pd->WWtable->entries);
+    XtFree((char *)pd->WWtable);
+}
+
+#define EHMAXSIZE 25 /* do not make whopping big */
+
+static Boolean CallEventHandlers(
+    Widget     widget,
+    XEvent    *event,
+    EventMask  mask)
+{
+    register XtEventRec *p;
+    XtEventHandler *proc;
+    XtPointer *closure;
+    XtEventHandler procs[EHMAXSIZE];
+    XtPointer closures[EHMAXSIZE];
+    Boolean cont_to_disp = True;
+    int i, numprocs;
+
+    /* Have to copy the procs into an array, because one of them might
+     * call XtRemoveEventHandler, which would break our linked list. */
+
+    numprocs = 0;
+    for (p=widget->core.event_table; p; p = p->next) {
+       if ((!p->has_type_specifier && (mask & p->mask)) ||
+           (p->has_type_specifier && event->type == EXT_TYPE(p)))
+           numprocs++;
+    }
+    if (numprocs > EHMAXSIZE) {
+       proc = (XtEventHandler *)__XtMalloc(numprocs * (sizeof(XtEventHandler) +
+                                                     sizeof(XtPointer)));
+       closure = (XtPointer *)(proc + numprocs);
+    } else {
+       proc = procs;
+       closure = closures;
+    }
+    numprocs = 0;
+    for (p=widget->core.event_table; p; p = p->next) {
+       if ((!p->has_type_specifier && (mask & p->mask)) ||
+           (p->has_type_specifier && event->type == EXT_TYPE(p))) {
+           proc[numprocs] = p->proc;
+           closure[numprocs] = p->closure;
+           numprocs++;
+       }
+    }
+/* FUNCTIONS CALLED THROUGH POINTER proc:
+               Selection.c:ReqCleanup,
+               "Shell.c":EventHandler,
+               PassivGrab.c:ActiveHandler,
+               PassivGrab.c:RealizeHandler,
+               Keyboard.c:QueryEventMask,
+               _XtHandleFocus,
+               Selection.c:HandleSelectionReplies,
+               Selection.c:HandleGetIncrement,
+               Selection.c:HandleIncremental,
+               Selection.c:HandlePropertyGone,
+               Selection.c:HandleSelectionEvents
+               */
+    for (i = 0; i < numprocs && cont_to_disp; i++)
+       (*(proc[i]))(widget, closure[i], event, &cont_to_disp);
+    if (numprocs > EHMAXSIZE)
+       XtFree((char *)proc);
+    return cont_to_disp;
+}
+
+static void CompressExposures(XEvent *, Widget);
+
+#define KnownButtons (Button1MotionMask|Button2MotionMask|Button3MotionMask|\
+                     Button4MotionMask|Button5MotionMask)
+
+/* keep this SMALL to avoid blowing stack cache! */
+/* because some compilers allocate all local locals on procedure entry */
+#define EHSIZE 4
+
+Boolean XtDispatchEventToWidget(
+    Widget widget,
+    XEvent* event)
+{
+    register XtEventRec *p;
+    Boolean was_dispatched = False;
+    Boolean call_tm = False;
+    Boolean cont_to_disp;
+    EventMask mask;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+
+    mask = _XtConvertTypeToMask(event->type);
+    if (event->type == MotionNotify)
+       mask |= (event->xmotion.state & KnownButtons);
+
+    LOCK_PROCESS;
+    if ( (mask == ExposureMask) ||
+        ((event->type == NoExpose) && NO_EXPOSE) ||
+        ((event->type == GraphicsExpose) && GRAPHICS_EXPOSE) ) {
+
+       if (widget->core.widget_class->core_class.expose != NULL ) {
+
+           /* We need to mask off the bits that could contain the information
+            * about whether or not we desire Graphics and NoExpose events.  */
+
+           if ( (COMP_EXPOSE_TYPE == XtExposeNoCompress) ||
+                (event->type == NoExpose) )
+
+               (*widget->core.widget_class->core_class.expose)
+                   (widget, event, (Region)NULL);
+           else {
+               CompressExposures(event, widget);
+           }
+           was_dispatched = True;
+       }
+    }
+
+    if ((mask == VisibilityChangeMask) &&
+        XtClass(widget)->core_class.visible_interest) {
+           was_dispatched = True;
+           /* our visibility just changed... */
+           switch (((XVisibilityEvent *)event)->state) {
+               case VisibilityUnobscured:
+                   widget->core.visible = TRUE;
+                   break;
+
+               case VisibilityPartiallyObscured:
+                   /* what do we want to say here? */
+                   /* well... some of us is visible */
+                   widget->core.visible = TRUE;
+                   break;
+
+               case VisibilityFullyObscured:
+                   widget->core.visible = FALSE;
+                   /* do we want to mark our children obscured? */
+                   break;
+           }
+       }
+    UNLOCK_PROCESS;
+
+    /* to maintain "copy" semantics we check TM now but call later */
+    if (widget->core.tm.translations &&
+       (mask & widget->core.tm.translations->eventMask))
+       call_tm = True;
+
+    cont_to_disp = True;
+    p=widget->core.event_table;
+    if (p) {
+       if (p->next) {
+           XtEventHandler proc[EHSIZE];
+           XtPointer closure[EHSIZE];
+           int numprocs = 0;
+
+           /* Have to copy the procs into an array, because one of them might
+            * call XtRemoveEventHandler, which would break our linked list. */
+
+           for (; p; p = p->next) {
+               if ((!p->has_type_specifier && (mask & p->mask)) ||
+                   (p->has_type_specifier && event->type == EXT_TYPE(p))) {
+                   if (numprocs >= EHSIZE)
+                       break;
+                   proc[numprocs] = p->proc;
+                   closure[numprocs] = p->closure;
+                   numprocs++;
+               }
+           }
+           if (numprocs) {
+               if (p) {
+                   cont_to_disp = CallEventHandlers(widget, event, mask);
+               } else {
+                   int i;
+                   for (i = 0; i < numprocs && cont_to_disp; i++)
+                       (*(proc[i]))(widget, closure[i], event, &cont_to_disp);
+/* FUNCTIONS CALLED THROUGH POINTER proc:
+               Selection.c:ReqCleanup,
+               "Shell.c":EventHandler,
+               PassivGrab.c:ActiveHandler,
+               PassivGrab.c:RealizeHandler,
+               Keyboard.c:QueryEventMask,
+               _XtHandleFocus,
+               Selection.c:HandleSelectionReplies,
+               Selection.c:HandleGetIncrement,
+               Selection.c:HandleIncremental,
+               Selection.c:HandlePropertyGone,
+               Selection.c:HandleSelectionEvents
+               */
+               }
+               was_dispatched = True;
+           }
+       } else if ((!p->has_type_specifier && (mask & p->mask)) ||
+                  (p->has_type_specifier && event->type == EXT_TYPE(p))) {
+           (*p->proc)(widget, p->closure, event, &cont_to_disp);
+           was_dispatched = True;
+       }
+    }
+    if (call_tm && cont_to_disp)
+       _XtTranslateEvent(widget, event);
+    UNLOCK_APP(app);
+    return (was_dispatched|call_tm);
+}
+
+/*
+ * This structure is passed into the check exposure proc.
+ */
+
+typedef struct _CheckExposeInfo {
+    int type1, type2;          /* Types of events to check for. */
+    Boolean maximal;           /* Ignore non-exposure events? */
+    Boolean non_matching;      /* Was there an event that did not
+                                  match either type? */
+    Window window;             /* Window to match. */
+} CheckExposeInfo;
+
+#define GetCount(ev) (((XExposeEvent *)(ev))->count)
+
+static void SendExposureEvent(XEvent *, Widget, XtPerDisplay);
+static Bool CheckExposureEvent(Display *, XEvent *, char *);
+static void AddExposureToRectangularRegion(XEvent *, Region);
+
+/*     Function Name: CompressExposures
+ *     Description: Handles all exposure compression
+ *     Arguments: event - the xevent that is to be dispatched
+ *                 widget - the widget that this event occured in.
+ *     Returns: none.
+ *
+ *      NOTE: Event must be of type Expose or GraphicsExpose.
+ */
+
+static void
+CompressExposures(
+XEvent * event,
+Widget widget)
+{
+    CheckExposeInfo info;
+    int count;
+    Display* dpy = XtDisplay (widget);
+    XtPerDisplay pd = _XtGetPerDisplay(dpy);
+    XtEnum comp_expose;
+    XtEnum comp_expose_type;
+    Boolean no_region;
+
+    LOCK_PROCESS;
+    comp_expose = COMP_EXPOSE;
+    UNLOCK_PROCESS;
+    comp_expose_type = comp_expose & 0x0f;
+    no_region = ((comp_expose & XtExposeNoRegion) ? True : False);
+
+    if (no_region)
+       AddExposureToRectangularRegion(event, pd->region);
+    else
+       XtAddExposureToRegion(event, pd->region);
+
+    if ( GetCount(event) != 0 )
+       return;
+
+    if ((comp_expose_type == XtExposeCompressSeries) ||
+       (XEventsQueued(dpy, QueuedAfterReading) == 0)) {
+       SendExposureEvent(event, widget, pd);
+       return;
+    }
+
+    if (comp_expose & XtExposeGraphicsExposeMerged) {
+       info.type1 = Expose;
+       info.type2 = GraphicsExpose;
+    }
+    else {
+       info.type1 = event->type;
+       info.type2 = 0;
+    }
+    info.maximal = (comp_expose_type == XtExposeCompressMaximal);
+    info.non_matching = FALSE;
+    info.window = XtWindow(widget);
+
+/*
+ * We have to be very careful here not to hose down the processor
+ * when blocking until count gets to zero.
+ *
+ * First, check to see if there are any events in the queue for this
+ * widget, and of the correct type.
+ *
+ * Once we cannot find any more events, check to see that count is zero.
+ * If it is not then block until we get another exposure event.
+ *
+ * If we find no more events, and count on the last one we saw was zero we
+ * we can be sure that all events have been processed.
+ *
+ * Unfortunately, we wind up having to look at the entire queue
+ * event if we're not doing Maximal compression, due to the
+ * semantics of XCheckIfEvent (we can't abort without re-ordering
+ * the event queue as a side-effect).
+ */
+
+    count = 0;
+    while (TRUE) {
+       XEvent event_return;
+
+       if (XCheckIfEvent(dpy, &event_return,
+                         CheckExposureEvent, (char *) &info)) {
+
+           count = GetCount(&event_return);
+           if (no_region)
+               AddExposureToRectangularRegion(&event_return, pd->region);
+           else
+               XtAddExposureToRegion(&event_return, pd->region);
+       }
+       else if (count != 0) {
+           XIfEvent(dpy, &event_return,
+                    CheckExposureEvent, (char *) &info);
+           count = GetCount(&event_return);
+           if (no_region)
+               AddExposureToRectangularRegion(&event_return, pd->region);
+           else
+               XtAddExposureToRegion(&event_return, pd->region);
+       }
+       else /* count == 0 && XCheckIfEvent Failed. */
+           break;
+    }
+
+    SendExposureEvent(event, widget, pd);
+}
+
+void XtAddExposureToRegion(
+    XEvent   *event,
+    Region   region)
+{
+    XRectangle rect;
+    XExposeEvent *ev = (XExposeEvent *) event;
+    /* These Expose and GraphicsExpose fields are at identical offsets */
+
+    if (event->type == Expose || event->type == GraphicsExpose) {
+       rect.x = ev->x;
+       rect.y = ev->y;
+       rect.width = ev->width;
+       rect.height = ev->height;
+       XUnionRectWithRegion(&rect, region, region);
+    }
+}
+
+#ifndef MAX
+#define MAX(a,b) (((a) > (b)) ? (a) : (b))
+#endif
+
+#ifndef MIN
+#define MIN(a,b) (((a) < (b)) ? (a) : (b))
+#endif
+
+static void AddExposureToRectangularRegion(
+     XEvent *event, /* when called internally, type is always appropriate */
+     Region  region)
+{
+    XRectangle rect;
+    XExposeEvent *ev = (XExposeEvent *) event;
+    /* These Expose and GraphicsExpose fields are at identical offsets */
+
+    rect.x = ev->x;
+    rect.y = ev->y;
+    rect.width = ev->width;
+    rect.height = ev->height;
+
+    if (XEmptyRegion(region)) {
+       XUnionRectWithRegion(&rect, region, region);
+    } else {
+       XRectangle merged, bbox;
+
+       XClipBox(region, &bbox);
+       merged.x = MIN(rect.x, bbox.x);
+       merged.y = MIN(rect.y, bbox.y);
+       merged.width = MAX(rect.x + rect.width,
+                          bbox.x + bbox.width) - merged.x;
+       merged.height = MAX(rect.y + rect.height,
+                           bbox.y + bbox.height) - merged.y;
+       XUnionRectWithRegion(&merged, region, region);
+    }
+}
+
+static Region nullRegion;
+/* READ-ONLY VARIABLES: nullRegion */
+
+void _XtEventInitialize(void)
+{
+#ifndef __lock_lint
+    nullRegion = XCreateRegion();
+#endif
+}
+
+/*     Function Name: SendExposureEvent
+ *     Description: Sets the x, y, width, and height of the event
+ *                   to be the clip box of Expose Region.
+ *     Arguments: event  - the X Event to mangle; Expose or GraphicsExpose.
+ *                 widget - the widget that this event occured in.
+ *                 pd     - the per display information for this widget.
+ *     Returns: none.
+ */
+
+static void
+SendExposureEvent(
+XEvent * event,
+Widget widget,
+XtPerDisplay pd)
+{
+    XtExposeProc expose;
+    XRectangle rect;
+    XtEnum comp_expose;
+    XExposeEvent *ev = (XExposeEvent *) event;
+
+    XClipBox(pd->region, &rect);
+    ev->x = rect.x;
+    ev->y = rect.y;
+    ev->width = rect.width;
+    ev->height = rect.height;
+
+    LOCK_PROCESS;
+    comp_expose = COMP_EXPOSE;
+    expose = widget->core.widget_class->core_class.expose;
+    UNLOCK_PROCESS;
+    if (comp_expose & XtExposeNoRegion)
+       (*expose)(widget, event, NULL);
+    else
+       (*expose)(widget, event, pd->region);
+    (void) XIntersectRegion(nullRegion, pd->region, pd->region);
+}
+
+/*     Function Name: CheckExposureEvent
+ *     Description: Checks the event queue for an expose event
+ *     Arguments: display - the display connection.
+ *                 event - the event to check.
+ *                 arg - a pointer to the exposure info structure.
+ *     Returns: TRUE if we found an event of the correct type
+ *               with the right window.
+ *
+ * NOTE: The only valid types (info.type1 and info.type2) are Expose
+ *       and GraphicsExpose.
+ */
+
+/* ARGSUSED */
+static Bool
+CheckExposureEvent(
+Display * disp,
+XEvent * event,
+char * arg)
+{
+    CheckExposeInfo * info = ((CheckExposeInfo *) arg);
+
+    if ( (info->type1 == event->type) || (info->type2 == event->type)) {
+       if (!info->maximal && info->non_matching) return FALSE;
+       if (event->type == GraphicsExpose)
+           return(event->xgraphicsexpose.drawable == info->window);
+       return(event->xexpose.window == info->window);
+    }
+    info->non_matching = TRUE;
+    return(FALSE);
+}
+
+static EventMask const masks[] = {
+       0,                          /* Error, should never see  */
+       0,                          /* Reply, should never see  */
+       KeyPressMask,               /* KeyPress                 */
+       KeyReleaseMask,             /* KeyRelease               */
+       ButtonPressMask,            /* ButtonPress              */
+       ButtonReleaseMask,          /* ButtonRelease            */
+       PointerMotionMask           /* MotionNotify             */
+               | ButtonMotionMask,
+       EnterWindowMask,            /* EnterNotify              */
+       LeaveWindowMask,            /* LeaveNotify              */
+       FocusChangeMask,            /* FocusIn                  */
+       FocusChangeMask,            /* FocusOut                 */
+       KeymapStateMask,            /* KeymapNotify             */
+       ExposureMask,               /* Expose                   */
+       NonMaskableMask,            /* GraphicsExpose, in GC    */
+       NonMaskableMask,            /* NoExpose, in GC          */
+       VisibilityChangeMask,       /* VisibilityNotify         */
+       SubstructureNotifyMask,     /* CreateNotify             */
+       StructureNotifyMask         /* DestroyNotify            */
+               | SubstructureNotifyMask,
+       StructureNotifyMask         /* UnmapNotify              */
+               | SubstructureNotifyMask,
+       StructureNotifyMask         /* MapNotify                */
+               | SubstructureNotifyMask,
+       SubstructureRedirectMask,   /* MapRequest               */
+       StructureNotifyMask         /* ReparentNotify           */
+               | SubstructureNotifyMask,
+       StructureNotifyMask         /* ConfigureNotify          */
+               | SubstructureNotifyMask,
+       SubstructureRedirectMask,   /* ConfigureRequest         */
+       StructureNotifyMask         /* GravityNotify            */
+               | SubstructureNotifyMask,
+       ResizeRedirectMask,         /* ResizeRequest            */
+       StructureNotifyMask         /* CirculateNotify          */
+               | SubstructureNotifyMask,
+       SubstructureRedirectMask,   /* CirculateRequest         */
+       PropertyChangeMask,         /* PropertyNotify           */
+       NonMaskableMask,            /* SelectionClear           */
+       NonMaskableMask,            /* SelectionRequest         */
+       NonMaskableMask,            /* SelectionNotify          */
+       ColormapChangeMask,         /* ColormapNotify           */
+       NonMaskableMask,            /* ClientMessage            */
+       NonMaskableMask             /* MappingNotify            */
+};
+
+EventMask _XtConvertTypeToMask (
+    int                eventType)
+{
+    if ((Cardinal) eventType < XtNumber(masks))
+       return masks[eventType];
+    else
+       return NoEventMask;
+}
+
+Boolean _XtOnGrabList(
+    register Widget widget,
+    XtGrabRec  *grabList)
+{
+    register XtGrabRec* gl;
+    for (; widget != NULL; widget = (Widget)widget->core.parent) {
+       for (gl = grabList; gl != NULL; gl = gl->next) {
+           if (gl->widget == widget) return TRUE;
+           if (gl->exclusive) break;
+       }
+    }
+    return FALSE;
+}
+
+static Widget LookupSpringLoaded(
+    XtGrabList grabList)
+{
+    XtGrabList gl;
+
+    for (gl = grabList; gl != NULL; gl = gl->next) {
+       if (gl->spring_loaded) {
+         if (XtIsSensitive(gl->widget))
+           return gl->widget;
+         else
+           return NULL;
+       }
+       if (gl->exclusive) break;
+    }
+    return NULL;
+}
+
+static Boolean DispatchEvent(
+    XEvent* event,
+    Widget widget)
+{
+
+    if (event->type == EnterNotify &&
+       event->xcrossing.mode == NotifyNormal &&
+       widget->core.widget_class->core_class.compress_enterleave) {
+       if (XPending(event->xcrossing.display)) {
+           XEvent nextEvent;
+           XPeekEvent(event->xcrossing.display, &nextEvent);
+           if (nextEvent.type == LeaveNotify &&
+               event->xcrossing.window == nextEvent.xcrossing.window &&
+               nextEvent.xcrossing.mode == NotifyNormal &&
+               ((event->xcrossing.detail != NotifyInferior &&
+                nextEvent.xcrossing.detail != NotifyInferior) ||
+                (event->xcrossing.detail == NotifyInferior &&
+                nextEvent.xcrossing.detail == NotifyInferior))) {
+               /* skip the enter/leave pair */
+               XNextEvent(event->xcrossing.display, &nextEvent);
+               return False;
+           }
+       }
+    }
+
+    if (event->type == MotionNotify &&
+           widget->core.widget_class->core_class.compress_motion) {
+       while (XPending(event->xmotion.display)) {
+           XEvent nextEvent;
+           XPeekEvent(event->xmotion.display, &nextEvent);
+           if (nextEvent.type == MotionNotify &&
+                   event->xmotion.window == nextEvent.xmotion.window &&
+                   event->xmotion.subwindow == nextEvent.xmotion.subwindow) {
+               /* replace the current event with the next one */
+               XNextEvent(event->xmotion.display, event);
+           } else break;
+       }
+    }
+
+    return XtDispatchEventToWidget(widget, event);
+}
+
+typedef enum _GrabType {pass, ignore, remap} GrabType;
+
+#if !defined(AIXV3) || !defined(AIXSHLIB)
+static /* AIX shared libraries are broken */
+#endif
+Boolean _XtDefaultDispatcher(
+    XEvent  *event)
+{
+    register    Widget widget;
+    GrabType    grabType;
+    XtPerDisplayInput pdi;
+    XtGrabList  grabList;
+    Boolean    was_dispatched = False;
+    DPY_TO_APPCON(event->xany.display);
+
+    /* the default dispatcher discards all extension events */
+    if (event->type >= LASTEvent)
+       return False;
+
+    LOCK_APP(app);
+
+    switch (event->type) {
+      case KeyPress:
+      case KeyRelease:
+      case ButtonPress:
+      case ButtonRelease:      grabType = remap;       break;
+      case MotionNotify:
+      case EnterNotify:                grabType = ignore;      break;
+      default:                 grabType = pass;        break;
+    }
+
+    widget = XtWindowToWidget (event->xany.display, event->xany.window);
+    pdi = _XtGetPerDisplayInput(event->xany.display);
+    grabList = *_XtGetGrabList(pdi);
+
+    if (widget == NULL) {
+       if (grabType == remap
+           && (widget = LookupSpringLoaded(grabList)) != NULL) {
+           /* event occurred in a non-widget window, but we've promised also
+              to dispatch it to the nearest accessible spring_loaded widget */
+           was_dispatched = (XFilterEvent(event, XtWindow(widget))
+                             || XtDispatchEventToWidget(widget, event));
+       }
+       else was_dispatched = XFilterEvent(event, None);
+    }
+    else if (grabType == pass) {
+       if (event->type == LeaveNotify ||
+           event->type == FocusIn ||
+           event->type == FocusOut) {
+               if (XtIsSensitive (widget))
+                   was_dispatched = (XFilterEvent(event, XtWindow(widget)) ||
+                                     XtDispatchEventToWidget(widget, event));
+           } else was_dispatched = (XFilterEvent(event, XtWindow(widget)) ||
+                                    XtDispatchEventToWidget(widget, event));
+    }
+    else if (grabType == ignore) {
+       if ((grabList == NULL || _XtOnGrabList(widget, grabList))
+           && XtIsSensitive(widget)) {
+           was_dispatched = (XFilterEvent(event, XtWindow(widget))
+                             || DispatchEvent(event, widget));
+       }
+    }
+    else if (grabType == remap) {
+       EventMask       mask = _XtConvertTypeToMask(event->type);
+       Widget          dspWidget;
+       Boolean         was_filtered = False;
+
+       dspWidget = _XtFindRemapWidget(event, widget, mask, pdi);
+
+       if ((grabList == NULL ||_XtOnGrabList(dspWidget, grabList))
+           && XtIsSensitive(dspWidget)) {
+           if ((was_filtered = XFilterEvent(event, XtWindow(dspWidget)))) {
+               /* If this event activated a device grab, release it. */
+               _XtUngrabBadGrabs(event, widget, mask, pdi);
+               was_dispatched = True;
+           } else
+               was_dispatched = XtDispatchEventToWidget(dspWidget, event);
+       }
+       else _XtUngrabBadGrabs(event, widget, mask, pdi);
+
+       if (!was_filtered) {
+           /* Also dispatch to nearest accessible spring_loaded. */
+           /* Fetch this afterward to reflect modal list changes */
+           grabList = *_XtGetGrabList(pdi);
+           widget = LookupSpringLoaded(grabList);
+           if (widget != NULL && widget != dspWidget) {
+               was_dispatched = (XFilterEvent(event, XtWindow(widget))
+                                 || XtDispatchEventToWidget(widget, event)
+                                 || was_dispatched);
+           }
+       }
+    }
+    UNLOCK_APP(app);
+    return was_dispatched;
+}
+
+Boolean XtDispatchEvent (
+    XEvent  *event)
+{
+    Boolean was_dispatched, safe;
+    int dispatch_level;
+    int starting_count;
+    XtPerDisplay pd;
+    Time       time = 0;
+    XtEventDispatchProc dispatch = _XtDefaultDispatcher;
+    XtAppContext app = XtDisplayToApplicationContext(event->xany.display);
+
+    LOCK_APP(app);
+    dispatch_level = ++app->dispatch_level;
+    starting_count = app->destroy_count;
+
+    switch (event->type) {
+      case KeyPress:
+      case KeyRelease:    time = event->xkey.time;             break;
+      case ButtonPress:
+      case ButtonRelease:  time = event->xbutton.time;         break;
+      case MotionNotify:   time = event->xmotion.time;         break;
+      case EnterNotify:
+      case LeaveNotify:           time = event->xcrossing.time;        break;
+      case PropertyNotify: time = event->xproperty.time;       break;
+      case SelectionClear: time = event->xselectionclear.time; break;
+
+      case MappingNotify:  _XtRefreshMapping(event, True);     break;
+    }
+    pd = _XtGetPerDisplay(event->xany.display);
+    if (time) pd->last_timestamp = time;
+    pd->last_event = *event;
+
+    if (pd->dispatcher_list) {
+       dispatch = pd->dispatcher_list[event->type];
+       if (dispatch == NULL) dispatch = _XtDefaultDispatcher;
+    }
+    was_dispatched = (*dispatch)(event);
+
+    /*
+     * To make recursive XtDispatchEvent work, we need to do phase 2 destroys
+     * only on those widgets destroyed by this particular dispatch.
+     *
+     */
+
+    if (app->destroy_count > starting_count)
+       _XtDoPhase2Destroy(app, dispatch_level);
+
+    app->dispatch_level = dispatch_level - 1;
+
+    if ((safe = _XtSafeToDestroy(app))) {
+       if (app->dpy_destroy_count != 0) _XtCloseDisplays(app);
+       if (app->free_bindings) _XtDoFreeBindings(app);
+    }
+    UNLOCK_APP(app);
+    LOCK_PROCESS;
+    if (_XtAppDestroyCount != 0 && safe) _XtDestroyAppContexts();
+    UNLOCK_PROCESS;
+    return was_dispatched;
+}
+
+/* ARGSUSED */
+static void GrabDestroyCallback(
+    Widget  widget,
+    XtPointer closure,
+    XtPointer call_data)
+{
+    /* Remove widget from grab list if it destroyed */
+    XtRemoveGrab(widget);
+}
+
+static XtGrabRec *NewGrabRec(
+    Widget  widget,
+    Boolean exclusive,
+    Boolean spring_loaded)
+{
+    register XtGrabList    gl;
+
+    gl               = XtNew(XtGrabRec);
+    gl->next         = NULL;
+    gl->widget        = widget;
+    gl->exclusive     = exclusive;
+    gl->spring_loaded = spring_loaded;
+
+    return gl;
+}
+
+void XtAddGrab(
+    Widget  widget,
+    _XtBoolean exclusive,
+    _XtBoolean spring_loaded)
+{
+    register    XtGrabList gl;
+    XtGrabList *grabListPtr;
+    XtAppContext app = XtWidgetToApplicationContext(widget);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    grabListPtr = _XtGetGrabList(_XtGetPerDisplayInput(XtDisplay(widget)));
+
+    if (spring_loaded && !exclusive) {
+       XtAppWarningMsg(app,
+               "grabError", "xtAddGrab", XtCXtToolkitError,
+               "XtAddGrab requires exclusive grab if spring_loaded is TRUE",
+               (String *) NULL, (Cardinal *) NULL);
+       exclusive = TRUE;
+    }
+
+    gl = NewGrabRec(widget, exclusive, spring_loaded);
+    gl->next = *grabListPtr;
+    *grabListPtr = gl;
+
+    XtAddCallback (widget, XtNdestroyCallback,
+           GrabDestroyCallback, (XtPointer) NULL);
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+}
+
+void XtRemoveGrab(
+    Widget  widget)
+{
+    register XtGrabList gl;
+    register Boolean done;
+    XtGrabList *grabListPtr;
+    XtAppContext app = XtWidgetToApplicationContext(widget);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+
+    grabListPtr = _XtGetGrabList(_XtGetPerDisplayInput(XtDisplay(widget)));
+
+    for (gl = *grabListPtr; gl != NULL; gl = gl->next) {
+       if (gl->widget == widget) break;
+    }
+
+    if (gl == NULL) {
+           XtAppWarningMsg(app,
+                      "grabError","xtRemoveGrab",XtCXtToolkitError,
+                      "XtRemoveGrab asked to remove a widget not on the list",
+                      (String *)NULL, (Cardinal *)NULL);
+           UNLOCK_PROCESS;
+           UNLOCK_APP(app);
+           return;
+       }
+
+    do {
+       gl = *grabListPtr;
+       done = (gl->widget == widget);
+       *grabListPtr = gl->next;
+       XtRemoveCallback(gl->widget, XtNdestroyCallback,
+               GrabDestroyCallback, (XtPointer)NULL);
+       XtFree((char *)gl);
+    } while (! done);
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+    return;
+}
+
+void XtMainLoop(void)
+{
+       XtAppMainLoop(_XtDefaultAppContext());
+}
+
+void XtAppMainLoop(
+       XtAppContext app)
+{
+    LOCK_APP(app);
+    do {
+       XtAppProcessEvent(app, XtIMAll);
+    } while(app->exit_flag == FALSE);
+    UNLOCK_APP(app);
+}
+
+void _XtFreeEventTable(
+    XtEventTable *event_table)
+{
+    register XtEventTable event;
+
+    event = *event_table;
+    while (event != NULL) {
+       register XtEventTable next = event->next;
+       XtFree((char *) event);
+       event = next;
+    }
+}
+
+Time XtLastTimestampProcessed(
+    Display *dpy)
+{
+    Time time;
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    time =  _XtGetPerDisplay(dpy)->last_timestamp;
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+    return(time);
+}
+
+XEvent* XtLastEventProcessed(
+    Display* dpy)
+{
+    XEvent* le = NULL;
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    le = &_XtGetPerDisplay(dpy)->last_event;
+    if (!le->xany.serial)
+       le =  NULL;
+    UNLOCK_APP(app);
+    return le;
+}
+
+void _XtSendFocusEvent(
+    Widget child,
+    int type)
+{
+    child = XtIsWidget(child) ? child : _XtWindowedAncestor(child);
+    if (XtIsSensitive(child) && !child->core.being_destroyed
+       && XtIsRealized(child)
+       && (XtBuildEventMask(child) & FocusChangeMask))
+    {
+       XFocusChangeEvent event;
+       Display* dpy = XtDisplay (child);
+
+       event.type = type;
+       event.serial = LastKnownRequestProcessed(dpy);
+       event.send_event = True;
+       event.display = dpy;
+       event.window = XtWindow(child);
+       event.mode = NotifyNormal;
+       event.detail = NotifyAncestor;
+       if (XFilterEvent((XEvent*)&event, XtWindow(child)))
+           return;
+       XtDispatchEventToWidget(child, (XEvent*)&event);
+    }
+}
+
+static XtEventDispatchProc* NewDispatcherList(void)
+{
+    XtEventDispatchProc* l =
+       (XtEventDispatchProc*) __XtCalloc((Cardinal) 128,
+                                       (Cardinal)sizeof(XtEventDispatchProc));
+    return l;
+}
+
+XtEventDispatchProc XtSetEventDispatcher(
+    Display            *dpy,
+    int                        event_type,
+    XtEventDispatchProc        proc)
+{
+    XtEventDispatchProc *list;
+    XtEventDispatchProc old_proc;
+    register XtPerDisplay pd;
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    pd = _XtGetPerDisplay(dpy);
+
+    list = pd->dispatcher_list;
+    if (!list) {
+       if (proc) list = pd->dispatcher_list = NewDispatcherList();
+       else return _XtDefaultDispatcher;
+    }
+    old_proc = list[event_type];
+    list[event_type] = proc;
+    if (old_proc == NULL) old_proc = _XtDefaultDispatcher;
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+    return old_proc;
+}
+
+void XtRegisterExtensionSelector(
+    Display            *dpy,
+    int                        min_event_type,
+    int                        max_event_type,
+    XtExtensionSelectProc      proc,
+    XtPointer          client_data)
+{
+    ExtSelectRec *e;
+    XtPerDisplay pd;
+    int i;
+    DPY_TO_APPCON(dpy);
+
+    if (dpy == NULL) XtErrorMsg("nullDisplay",
+               "xtRegisterExtensionSelector", XtCXtToolkitError,
+               "XtRegisterExtensionSelector requires a non-NULL display",
+               (String *) NULL, (Cardinal *) NULL);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    pd = _XtGetPerDisplay(dpy);
+
+    for (i = 0; i < pd->ext_select_count; i++) {
+       e = &pd->ext_select_list[i];
+       if (e->min == min_event_type && e->max == max_event_type) {
+           e->proc = proc;
+           e->client_data = client_data;
+           return;
+       }
+       if ((min_event_type >= e->min && min_event_type <= e->max) ||
+           (max_event_type >= e->min && max_event_type <= e->max)) {
+           XtErrorMsg("rangeError", "xtRegisterExtensionSelector",
+                      XtCXtToolkitError,
+       "Attempt to register multiple selectors for one extension event type",
+                      (String *) NULL, (Cardinal *) NULL);
+           UNLOCK_PROCESS;
+           UNLOCK_APP(app);
+           return;
+       }
+    }
+    pd->ext_select_count++;
+    pd->ext_select_list =
+           (ExtSelectRec *) XtRealloc((char *) pd->ext_select_list,
+                      pd->ext_select_count * sizeof(ExtSelectRec));
+    for (i = pd->ext_select_count - 1; i > 0; i--) {
+       if (pd->ext_select_list[i-1].min > min_event_type) {
+           pd->ext_select_list[i] = pd->ext_select_list[i-1];
+       } else break;
+    }
+    pd->ext_select_list[i].min = min_event_type;
+    pd->ext_select_list[i].max = max_event_type;
+    pd->ext_select_list[i].proc = proc;
+    pd->ext_select_list[i].client_data = client_data;
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+}
+
+void _XtExtensionSelect(
+    Widget widget)
+{
+    int i;
+    XtPerDisplay pd;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+
+    pd = _XtGetPerDisplay(XtDisplay(widget));
+
+    for (i = 0; i < pd->ext_select_count; i++) {
+       CallExtensionSelector(widget, pd->ext_select_list+i, FALSE);
+    }
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+}
diff --git a/src/EventUtil.c b/src/EventUtil.c
new file mode 100644 (file)
index 0000000..91ad31f
--- /dev/null
@@ -0,0 +1,232 @@
+/*
+
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+*/
+/********************************************************
+
+Copyright 1988 by Hewlett-Packard Company
+Copyright 1987, 1988, 1989 by Digital Equipment Corporation, Maynard, Massachusetts
+
+Permission to use, copy, modify, and distribute this software
+and its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that copyright notice and this permission
+notice appear in supporting documentation, and that the names of
+Hewlett-Packard or Digital not be used in advertising or
+publicity pertaining to distribution of the software without specific,
+written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+********************************************************/
+
+/*
+
+Copyright 1987, 1988, 1989, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "PassivGraI.h"
+#include "StringDefs.h"
+#include "EventI.h"
+
+static XContext        perWidgetInputContext = 0;
+
+void _XtFreePerWidgetInput(
+    Widget             w,
+    XtPerWidgetInput   pwi)
+{
+    LOCK_PROCESS;
+    XDeleteContext(XtDisplay(w),
+                  (Window)w,
+                  perWidgetInputContext);
+
+    XtFree((char *)pwi);
+    UNLOCK_PROCESS;
+}
+
+/*
+ * This routine gets the passive list associated with the widget
+ * from the context manager.
+ */
+XtPerWidgetInput _XtGetPerWidgetInput(
+    Widget     widget,
+    _XtBoolean create)
+{
+    XtPerWidgetInput   pwi = NULL;
+    Display            *dpy = widget->core.screen->display;
+
+    LOCK_PROCESS;
+    if (! perWidgetInputContext)
+      perWidgetInputContext = XUniqueContext();
+
+    if (XFindContext(dpy,
+                    (Window)widget,
+                    perWidgetInputContext,
+                    (XPointer *)&pwi) &&
+       create)
+      {
+         pwi = (XtPerWidgetInput)
+           __XtMalloc((unsigned) sizeof(XtPerWidgetInputRec));
+
+         pwi->focusKid = NULL;
+         pwi->queryEventDescendant = NULL;
+         pwi->focalPoint = XtUnrelated;
+         pwi->keyList =
+           pwi->ptrList = NULL;
+
+         pwi->haveFocus =
+             pwi->map_handler_added =
+                 pwi->realize_handler_added =
+                     pwi->active_handler_added = FALSE;
+
+         XtAddCallback(widget, XtNdestroyCallback,
+                       _XtDestroyServerGrabs, (XtPointer)pwi);
+
+         (void) XSaveContext(dpy,
+                             (Window)widget,
+                             perWidgetInputContext,
+                             (char *) pwi);
+      }
+    UNLOCK_PROCESS;
+    return pwi;
+}
+
+
+void _XtFillAncestorList(
+    Widget     **listPtr,
+    int                *maxElemsPtr,
+    int                *numElemsPtr,
+    Widget     start,
+    Widget     breakWidget)
+{
+#define CACHESIZE 16
+    Cardinal   i;
+    Widget     w;
+    Widget     *trace = *listPtr;
+
+    /* First time in, allocate the ancestor list */
+    if (trace == NULL)
+      {
+         trace = (Widget *) __XtMalloc(CACHESIZE * sizeof(Widget));
+         *maxElemsPtr = CACHESIZE;
+      }
+    /* First fill in the ancestor list */
+
+    trace[0] = start;
+
+    for (i = 1, w = XtParent(start);
+        w != NULL && !XtIsShell(trace[i-1]) && trace[i-1] != breakWidget;
+        w = XtParent(w), i++) {
+       if (i == (Cardinal) *maxElemsPtr) {
+           /* This should rarely happen, but if it does it'll probably
+              happen again, so grow the ancestor list */
+           *maxElemsPtr += CACHESIZE;
+           trace = (Widget *) XtRealloc((char*)trace,
+                                        sizeof(Widget) * (*maxElemsPtr));
+       }
+       trace[i] = w;
+    }
+    *listPtr = trace;
+    *numElemsPtr = i;
+#undef CACHESIZE
+}
+
+
+Widget _XtFindRemapWidget(
+    XEvent     *event,
+    Widget     widget,
+    EventMask  mask,
+    XtPerDisplayInput pdi)
+{
+    Widget             dspWidget = widget;
+
+    if (!pdi->traceDepth || !(widget == pdi->trace[0]))
+      {
+         _XtFillAncestorList(&pdi->trace, &pdi->traceMax,
+                             &pdi->traceDepth, widget, NULL);
+         pdi->focusWidget = NULL; /* invalidate the focus
+                                     cache */
+      }
+    if (mask & (KeyPressMask | KeyReleaseMask))
+         dspWidget = _XtProcessKeyboardEvent((XKeyEvent*)event, widget, pdi);
+    else if (mask &(ButtonPressMask | ButtonReleaseMask))
+         dspWidget = _XtProcessPointerEvent((XButtonEvent*)event, widget,pdi);
+
+    return dspWidget;
+}
+
+void _XtUngrabBadGrabs(
+    XEvent     *event,
+    Widget     widget,
+    EventMask  mask,
+    XtPerDisplayInput pdi)
+{
+    XKeyEvent  * ke = (XKeyEvent *) event;
+
+    if (mask & (KeyPressMask | KeyReleaseMask))
+      {
+         if (IsServerGrab(pdi->keyboard.grabType) &&
+             !_XtOnGrabList(pdi->keyboard.grab.widget,
+                            pdi->grabList))
+           XtUngrabKeyboard(widget, ke->time);
+
+      }
+    else
+      {
+         if (IsServerGrab(pdi->pointer.grabType) &&
+             !_XtOnGrabList(pdi->pointer.grab.widget,
+                            pdi->grabList))
+           XtUngrabPointer(widget, ke->time);
+      }
+}
diff --git a/src/Functions.c b/src/Functions.c
new file mode 100644 (file)
index 0000000..9937a50
--- /dev/null
@@ -0,0 +1,216 @@
+/*
+
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+*/
+
+/*
+
+Copyright 1985, 1986, 1987, 1988, 1989, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include <X11/Shell.h>
+#include <X11/Vendor.h>
+
+/*
+ * This file defines functional equivalents to all macros defined
+ * in Intrinsic.h
+ *
+ */
+
+#undef XtIsRectObj
+Boolean XtIsRectObj(Widget object)
+{
+    return _XtCheckSubclassFlag(object, 0x02);
+}
+
+
+#undef XtIsWidget
+Boolean XtIsWidget(Widget object)
+{
+    return _XtCheckSubclassFlag(object, 0x04);
+}
+
+
+#undef XtIsComposite
+Boolean XtIsComposite(Widget object)
+{
+    return _XtCheckSubclassFlag(object, 0x08);
+}
+
+
+#undef XtIsConstraint
+Boolean XtIsConstraint(Widget object)
+{
+    return _XtCheckSubclassFlag(object, 0x10);
+}
+
+
+#undef XtIsShell
+Boolean XtIsShell(Widget object)
+{
+    return _XtCheckSubclassFlag(object, 0x20);
+}
+
+
+#undef XtIsOverrideShell
+Boolean XtIsOverrideShell(Widget object)
+{
+    return _XtIsSubclassOf(object, (WidgetClass)overrideShellWidgetClass,
+                          (WidgetClass)shellWidgetClass, 0x20);
+}
+
+
+#undef XtIsWMShell
+Boolean XtIsWMShell(Widget object)
+{
+    return _XtCheckSubclassFlag(object, 0x40);
+}
+
+
+#undef XtIsVendorShell
+Boolean XtIsVendorShell(Widget object)
+{
+    Boolean retval;
+
+    LOCK_PROCESS;
+    retval = _XtIsSubclassOf(object,
+#ifdef notdef
+/*
+ * We don't refer to vendorShell directly, because some shared libraries
+ * bind local references tightly.
+ */
+                          (WidgetClass)vendorShellWidgetClass,
+#endif
+                          transientShellWidgetClass->core_class.superclass,
+                          (WidgetClass)wmShellWidgetClass, 0x40);
+    UNLOCK_PROCESS;
+    return retval;
+}
+
+
+#undef XtIsTransientShell
+Boolean XtIsTransientShell(Widget object)
+{
+    return _XtIsSubclassOf(object, (WidgetClass)transientShellWidgetClass,
+                          (WidgetClass)wmShellWidgetClass, 0x40);
+}
+
+
+#undef XtIsTopLevelShell
+Boolean XtIsTopLevelShell(Widget object)
+{
+    return _XtCheckSubclassFlag(object, 0x80);
+}
+
+
+#undef XtIsApplicationShell
+Boolean XtIsApplicationShell(Widget object)
+{
+    return _XtIsSubclassOf(object, (WidgetClass)applicationShellWidgetClass,
+                          (WidgetClass)topLevelShellWidgetClass, 0x80);
+}
+
+#undef XtIsSessionShell
+Boolean XtIsSessionShell(Widget object)
+{
+    return _XtIsSubclassOf(object, (WidgetClass)sessionShellWidgetClass,
+                          (WidgetClass)topLevelShellWidgetClass, 0x80);
+}
+
+#undef XtMapWidget
+void XtMapWidget(Widget w)
+{
+    Widget hookobj;
+    WIDGET_TO_APPCON(w);
+
+    LOCK_APP(app);
+    XMapWindow(XtDisplay(w), XtWindow(w));
+    hookobj = XtHooksOfDisplay(XtDisplay(w));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+       XtChangeHookDataRec call_data;
+
+       call_data.type = XtHmapWidget;
+       call_data.widget = w;
+       XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.changehook_callbacks,
+               (XtPointer)&call_data);
+    }
+    UNLOCK_APP(app);
+}
+
+
+#undef XtUnmapWidget
+void XtUnmapWidget(Widget w)
+{
+    Widget hookobj;
+    WIDGET_TO_APPCON(w);
+
+    LOCK_APP(app);
+    XUnmapWindow(XtDisplay(w), XtWindow(w));
+    hookobj = XtHooksOfDisplay(XtDisplay(w));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+       XtChangeHookDataRec call_data;
+
+       call_data.type = XtHunmapWidget;
+       call_data.widget = w;
+       XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.changehook_callbacks,
+               (XtPointer)&call_data);
+    }
+    UNLOCK_APP(app);
+}
+
+
+#undef XtNewString
+String XtNewString(String str)
+{
+    if (str == NULL)
+       return NULL;
+    else
+       return strcpy(__XtMalloc((unsigned)strlen(str) + 1), str);
+}
diff --git a/src/GCManager.c b/src/GCManager.c
new file mode 100644 (file)
index 0000000..ba3d9c4
--- /dev/null
@@ -0,0 +1,361 @@
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988, 1990 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1990, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+
+
+typedef struct _GCrec {
+    unsigned char screen;      /* Screen for GC */
+    unsigned char depth;       /* Depth for GC */
+    char         dashes;       /* Dashes value */
+    Pixmap       clip_mask;    /* Clip_mask value */
+    Cardinal     ref_count;    /* # of shareholders */
+    GC           gc;           /* The GC itself. */
+    XtGCMask     dynamic_mask; /* Writable values */
+    XtGCMask     unused_mask;  /* Unused values */
+    struct _GCrec *next;       /* Next GC for this widgetkind. */
+} GCrec, *GCptr;
+
+#define GCVAL(bit,mask,val,default) ((bit&mask) ? val : default)
+
+#define CHECK(bit,comp,default) \
+    if ((checkMask & bit) && \
+       (GCVAL(bit,valueMask,v->comp,default) != gcv.comp)) return False
+
+#define ALLGCVALS (GCFunction | GCPlaneMask | GCForeground | \
+                  GCBackground | GCLineWidth | GCLineStyle | \
+                  GCCapStyle | GCJoinStyle | GCFillStyle | \
+                  GCFillRule | GCTile | GCStipple | \
+                  GCTileStipXOrigin | GCTileStipYOrigin | \
+                  GCFont | GCSubwindowMode | GCGraphicsExposures | \
+                  GCClipXOrigin | GCClipYOrigin | GCDashOffset | \
+                  GCArcMode)
+
+static Bool Matches(
+    Display *dpy,
+    GCptr ptr,
+    register XtGCMask valueMask,
+    register XGCValues *v,
+    XtGCMask readOnlyMask,
+    XtGCMask dynamicMask)
+{
+    XGCValues gcv;
+    register XtGCMask checkMask;
+
+    if (readOnlyMask & ptr->dynamic_mask)
+       return False;
+    if (((ptr->dynamic_mask|ptr->unused_mask) & dynamicMask) != dynamicMask)
+       return False;
+    if (!XGetGCValues(dpy, ptr->gc, ALLGCVALS, &gcv))
+       return False;
+    checkMask = readOnlyMask & ~ptr->unused_mask;
+    CHECK(GCForeground, foreground, 0);
+    CHECK(GCBackground, background, 1);
+    CHECK(GCFont, font, ~0UL);
+    CHECK(GCFillStyle, fill_style, FillSolid);
+    CHECK(GCLineWidth, line_width, 0);
+    CHECK(GCFunction, function, GXcopy);
+    CHECK(GCGraphicsExposures, graphics_exposures, True);
+    CHECK(GCTile, tile, ~0UL);
+    CHECK(GCSubwindowMode, subwindow_mode, ClipByChildren);
+    CHECK(GCPlaneMask, plane_mask, AllPlanes);
+    CHECK(GCLineStyle, line_style, LineSolid);
+    CHECK(GCCapStyle, cap_style, CapButt);
+    CHECK(GCJoinStyle, join_style, JoinMiter);
+    CHECK(GCFillRule, fill_rule, EvenOddRule);
+    CHECK(GCArcMode, arc_mode, ArcPieSlice);
+    CHECK(GCStipple, stipple, ~0UL);
+    CHECK(GCTileStipXOrigin, ts_x_origin, 0);
+    CHECK(GCTileStipYOrigin, ts_y_origin, 0);
+    CHECK(GCClipXOrigin, clip_x_origin, 0);
+    CHECK(GCClipYOrigin, clip_y_origin, 0);
+    CHECK(GCDashOffset, dash_offset, 0);
+    gcv.clip_mask = ptr->clip_mask;
+    CHECK(GCClipMask, clip_mask, None);
+    gcv.dashes = ptr->dashes;
+    CHECK(GCDashList, dashes, 4);
+    valueMask &= ptr->unused_mask | dynamicMask;
+    if (valueMask) {
+       XChangeGC(dpy, ptr->gc, valueMask, v);
+       if (valueMask & GCDashList)
+           ptr->dashes = v->dashes;
+       if (valueMask & GCClipMask)
+           ptr->clip_mask = v->clip_mask;
+    }
+    ptr->unused_mask &= ~(dynamicMask | readOnlyMask);
+    ptr->dynamic_mask |= dynamicMask;
+    return True;
+} /* Matches */
+
+/* Called by CloseDisplay to free the per-display GC list */
+void _XtGClistFree(
+    Display *dpy,
+    register XtPerDisplay pd)
+{
+    register GCptr GClist, next;
+    register int i;
+
+    GClist = pd->GClist;
+    while (GClist) {
+       next = GClist->next;
+       XtFree((char*)GClist);
+       GClist = next;
+    }
+    if (pd->pixmap_tab) {
+       for (i = ScreenCount(dpy); --i >= 0; ) {
+           if (pd->pixmap_tab[i])
+               XtFree((char *)pd->pixmap_tab[i]);
+       }
+       XtFree((char *)pd->pixmap_tab);
+    }
+}
+
+
+/*
+ * Return a GC with the given values and characteristics.
+ */
+
+GC XtAllocateGC(
+    register Widget widget,
+    Cardinal       depth,
+    XtGCMask        valueMask,
+    XGCValues       *values,
+    XtGCMask        dynamicMask,
+    XtGCMask        unusedMask)
+{
+    register GCptr *prev;
+    register GCptr cur;
+    Screen *screen;
+    register Display *dpy;
+    register XtPerDisplay pd;
+    Drawable drawable;
+    Drawable *pixmaps;
+    XtGCMask readOnlyMask;
+    GC retval;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    if (!XtIsWidget(widget))
+       widget = _XtWindowedAncestor(widget);
+    if (!depth)
+       depth = widget->core.depth;
+    screen = XtScreen(widget);
+    dpy = DisplayOfScreen(screen);
+    pd = _XtGetPerDisplay(dpy);
+    unusedMask &= ~valueMask;
+    readOnlyMask = ~(dynamicMask | unusedMask);
+
+    /* Search for existing GC that matches exactly */
+    for (prev = &pd->GClist; (cur = *prev); prev = &cur->next) {
+       if (cur->depth == depth &&
+           ScreenOfDisplay(dpy, cur->screen) == screen &&
+           Matches(dpy, cur, valueMask, values, readOnlyMask, dynamicMask)) {
+            cur->ref_count++;
+           /* Move this GC to front of list */
+           *prev = cur->next;
+           cur->next = pd->GClist;
+           pd->GClist = cur;
+           retval = cur->gc;
+           UNLOCK_PROCESS;
+           UNLOCK_APP(app);
+           return retval;
+       }
+    }
+
+    /* No matches, have to create a new one */
+    cur = XtNew(GCrec);
+    cur->screen = XScreenNumberOfScreen(screen);
+    cur->depth = depth;
+    cur->ref_count = 1;
+    cur->dynamic_mask = dynamicMask;
+    cur->unused_mask = (unusedMask & ~dynamicMask);
+    cur->dashes = GCVAL(GCDashList, valueMask, values->dashes, 4);
+    cur->clip_mask = GCVAL(GCClipMask, valueMask, values->clip_mask, None);
+    drawable = 0;
+    if (depth == widget->core.depth)
+       drawable = XtWindow(widget);
+    if (!drawable && depth == (Cardinal) DefaultDepthOfScreen(screen))
+       drawable = RootWindowOfScreen(screen);
+    if (!drawable) {
+       if (!pd->pixmap_tab) {
+           int n;
+           pd->pixmap_tab = (Drawable **)__XtMalloc((unsigned)ScreenCount(dpy) *
+                                                  sizeof(Drawable *));
+           for (n = 0; n < ScreenCount(dpy); n++)
+               pd->pixmap_tab[n] = NULL;
+       }
+       pixmaps = pd->pixmap_tab[cur->screen];
+       if (!pixmaps) {
+           int max, n, *depths;
+           depths = XListDepths(dpy, cur->screen, &n);
+           n--;
+           max = depths[n];
+           while (n--) {
+               if (depths[n] > max)
+                   max = depths[n];
+           }
+           XFree((char *)depths);
+           pixmaps = (Drawable *)__XtCalloc((unsigned)max, sizeof(Drawable));
+           pd->pixmap_tab[cur->screen] = pixmaps;
+       }
+       drawable = pixmaps[cur->depth - 1];
+       if (!drawable) {
+           drawable = XCreatePixmap(dpy, RootWindowOfScreen(screen), 1, 1,
+                                    cur->depth);
+           pixmaps[cur->depth - 1] = drawable;
+       }
+    }
+    cur->gc = XCreateGC(dpy, drawable, valueMask, values);
+    cur->next = pd->GClist;
+    pd->GClist = cur;
+    retval = cur->gc;
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+    return retval;
+} /* XtAllocateGC */
+
+/*
+ * Return a read-only GC with the given values.
+ */
+
+GC XtGetGC(
+    register Widget widget,
+    XtGCMask        valueMask,
+    XGCValues       *values)
+{
+    return XtAllocateGC(widget, 0, valueMask, values, 0, 0);
+} /* XtGetGC */
+
+void  XtReleaseGC(
+    Widget      widget,
+    register GC gc)
+{
+    register GCptr cur, *prev;
+    Display* dpy;
+    XtPerDisplay pd;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    dpy = XtDisplayOfObject(widget);
+    pd = _XtGetPerDisplay(dpy);
+
+    for (prev = &pd->GClist; (cur = *prev); prev = &cur->next) {
+       if (cur->gc == gc) {
+           if (--(cur->ref_count) == 0) {
+               *prev = cur->next;
+               XFreeGC(dpy, gc);
+               XtFree((char *) cur);
+           }
+           break;
+       }
+    }
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+} /* XtReleaseGC */
+
+/*  The following interface is broken and supplied only for backwards
+ *  compatibility.  It will work properly in all cases only if there
+ *  is exactly 1 Display created by the application.
+ */
+
+void XtDestroyGC(register GC gc)
+{
+    GCptr cur, *prev;
+    XtAppContext app;
+
+    LOCK_PROCESS;
+    app = _XtGetProcessContext()->appContextList;
+    /* This is awful; we have to search through all the lists
+       to find the GC. */
+    for (; app; app = app->next) {
+       int i;
+       for (i = app->count; i ;) {
+           Display *dpy = app->list[--i];
+           XtPerDisplay pd = _XtGetPerDisplay(dpy);
+           for (prev = &pd->GClist; (cur = *prev); prev = &cur->next) {
+               if (cur->gc == gc) {
+                   if (--(cur->ref_count) == 0) {
+                       *prev = cur->next;
+                       XFreeGC(dpy, gc);
+                       XtFree((char *) cur);
+                   }
+                   UNLOCK_PROCESS;
+                   return;
+               }
+           }
+       }
+    }
+    UNLOCK_PROCESS;
+} /* XtDestroyGC */
diff --git a/src/Geometry.c b/src/Geometry.c
new file mode 100644 (file)
index 0000000..d64c8e2
--- /dev/null
@@ -0,0 +1,825 @@
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "ShellP.h"
+#include "ShellI.h"
+
+static void ClearRectObjAreas(
+    RectObj r,
+    XWindowChanges* old)
+{
+    Widget pw = _XtWindowedAncestor((Widget)r);
+    int bw2;
+
+    bw2 = old->border_width << 1;
+    XClearArea( XtDisplay(pw), XtWindow(pw),
+               old->x, old->y,
+               old->width + bw2, old->height + bw2,
+               TRUE );
+
+    bw2 = r->rectangle.border_width << 1;
+    XClearArea( XtDisplay(pw), XtWindow(pw),
+               (int)r->rectangle.x, (int)r->rectangle.y,
+               (unsigned int)(r->rectangle.width + bw2),
+               (unsigned int)(r->rectangle.height + bw2),
+               TRUE );
+}
+
+/*
+ * Internal function used by XtMakeGeometryRequest and XtSetValues.
+ * Returns more data than the public interface.  Does not convert
+ * XtGeometryDone to XtGeometryYes.
+ *
+ * clear_rect_obj - *** RETURNED ***
+ *                 TRUE if the rect obj has been cleared, false otherwise.
+ */
+
+XtGeometryResult
+_XtMakeGeometryRequest (
+    Widget widget,
+    XtWidgetGeometry *request,
+    XtWidgetGeometry *reply,
+    Boolean * clear_rect_obj)
+{
+    XtWidgetGeometry    junk;
+    XtGeometryHandler manager = (XtGeometryHandler) NULL;
+    XtGeometryResult returnCode;
+    Widget parent = widget->core.parent;
+    Boolean managed, parentRealized, rgm = False;
+    XtConfigureHookDataRec req;
+    Widget hookobj;
+
+    *clear_rect_obj = FALSE;
+
+    CALLGEOTAT(_XtGeoTrace(widget,
+       "\"%s\" is making a %sgeometry request to its parent \"%s\".\n",
+                  XtName(widget),
+                  ((request->request_mode & XtCWQueryOnly))? "query only ":"",
+                  (XtParent(widget))?XtName(XtParent(widget)):"Root"));
+    CALLGEOTAT(_XtGeoTab(1));
+
+    if (XtIsShell(widget)) {
+       ShellClassExtension ext;
+       LOCK_PROCESS;
+       for (ext = (ShellClassExtension)((ShellWidgetClass)XtClass(widget))
+                  ->shell_class.extension;
+            ext != NULL && ext->record_type != NULLQUARK;
+            ext = (ShellClassExtension)ext->next_extension);
+
+       if (ext != NULL) {
+           if (  ext->version == XtShellExtensionVersion
+                 && ext->record_size == sizeof(ShellClassExtensionRec)) {
+               manager = ext->root_geometry_manager;
+               rgm = True;
+           } else {
+               String params[1];
+               Cardinal num_params = 1;
+               params[0] = XtClass(widget)->core_class.class_name;
+               XtAppErrorMsg(XtWidgetToApplicationContext(widget),
+                    "invalidExtension", "xtMakeGeometryRequest",
+                    XtCXtToolkitError,
+                    "widget class %s has invalid ShellClassExtension record",
+                    params, &num_params);
+           }
+       } else {
+           XtAppErrorMsg(XtWidgetToApplicationContext(widget),
+                         "internalError", "xtMakeGeometryRequest",
+                         XtCXtToolkitError,
+                         "internal error; ShellClassExtension is NULL",
+                         NULL, NULL);
+       }
+       managed = True;
+       parentRealized = TRUE;
+       UNLOCK_PROCESS;
+    } else /* not shell */ {
+       if (parent == NULL)
+           XtAppErrorMsg(XtWidgetToApplicationContext(widget),
+                         "invalidParent","xtMakeGeometryRequest",
+                         XtCXtToolkitError,
+                         "non-shell has no parent in XtMakeGeometryRequest",
+                         (String *)NULL, (Cardinal *)NULL);
+
+       managed = XtIsManaged(widget);
+       parentRealized = XtIsRealized(parent);
+       if (XtIsComposite(parent))
+       {
+           LOCK_PROCESS;
+           manager = ((CompositeWidgetClass) (parent->core.widget_class))
+                     ->composite_class.geometry_manager;
+           UNLOCK_PROCESS;
+       }
+    }
+
+#if 0
+    /*
+     * The Xt spec says that these conditions must generate
+     * error messages (not warnings), but many Xt applications
+     * and toolkits (including parts of Xaw, Motif and Netscape)
+     * depend on the previous Xt behaviour.  Thus, these tests
+     * should probably remain disabled.
+     */
+    if (parentRealized && managed) {
+       if (parent && !XtIsComposite(parent))
+       {
+           /*
+            * This shouldn't ever happen, we only test for this to pass
+            * VSW5.  Normally managing the widget will catch this, but VSW5
+            * does some really screwy stuff to get here.
+            */
+           XtAppErrorMsg(XtWidgetToApplicationContext(widget),
+                         "invalidParent", "xtMakeGeometryRequest",
+                         XtCXtToolkitError,
+                         "XtMakeGeometryRequest - parent not composite",
+                         (String *)NULL, (Cardinal *)NULL);
+       }
+       else if (manager == (XtGeometryHandler) NULL)
+       {
+           XtAppErrorMsg(XtWidgetToApplicationContext(widget),
+                         "invalidGeometryManager","xtMakeGeometryRequest",
+                         XtCXtToolkitError,
+                         "XtMakeGeometryRequest - parent has no geometry manager",
+                         (String *)NULL, (Cardinal *)NULL);
+       }
+    }
+#else
+    if (!manager)
+       managed = False;
+#endif
+
+    if (widget->core.being_destroyed) {
+       CALLGEOTAT(_XtGeoTab(-1));
+       CALLGEOTAT(_XtGeoTrace(widget,
+                      "It is being destroyed, just return XtGeometryNo.\n"));
+       return XtGeometryNo;
+    }
+
+    /* see if requesting anything to change */
+    req.changeMask = 0;
+    if (request->request_mode & CWStackMode
+       && request->stack_mode != XtSMDontChange) {
+           req.changeMask |= CWStackMode;
+           CALLGEOTAT(_XtGeoTrace(widget,
+                                  "Asking for a change in StackMode!\n"));
+           if (request->request_mode & CWSibling) {
+               XtCheckSubclass(request->sibling, rectObjClass,
+                               "XtMakeGeometryRequest");
+               req.changeMask |= CWSibling;
+           }
+    }
+    if (request->request_mode & CWX
+       && widget->core.x != request->x) {
+       CALLGEOTAT(_XtGeoTrace(widget,
+                              "Asking for a change in x: from %d to %d.\n",
+                              widget->core.x, request->x));
+       req.changeMask |= CWX;
+    }
+    if (request->request_mode & CWY
+       && widget->core.y != request->y) {
+       CALLGEOTAT(_XtGeoTrace(widget,
+                              "Asking for a change in y: from %d to %d.\n",
+                              widget->core.y, request->y));
+       req.changeMask |= CWY;
+    }
+    if (request->request_mode & CWWidth
+       && widget->core.width != request->width) {
+       CALLGEOTAT(_XtGeoTrace(widget,"Asking for a change in width: from %d to %d.\n",
+                      widget->core.width, request->width));
+       req.changeMask |= CWWidth;
+    }
+    if (request->request_mode & CWHeight
+       && widget->core.height != request->height) {
+       CALLGEOTAT(_XtGeoTrace(widget,
+                           "Asking for a change in height: from %d to %d.\n",
+                              widget->core.height, request->height));
+       req.changeMask |= CWHeight;
+    }
+    if (request->request_mode & CWBorderWidth
+       && widget->core.border_width != request->border_width){
+       CALLGEOTAT(_XtGeoTrace(widget,
+                      "Asking for a change in border_width: from %d to %d.\n",
+                      widget->core.border_width, request->border_width));
+       req.changeMask |= CWBorderWidth;
+    }
+    if (! req.changeMask) {
+       CALLGEOTAT(_XtGeoTrace(widget,
+                      "Asking for nothing new,\n"));
+       CALLGEOTAT(_XtGeoTab(-1));
+       CALLGEOTAT(_XtGeoTrace(widget,
+                      "just return XtGeometryYes.\n"));
+       return XtGeometryYes;
+    }
+    req.changeMask |= (request->request_mode & XtCWQueryOnly);
+
+    if ( !(req.changeMask & XtCWQueryOnly) && XtIsRealized(widget) ) {
+       /* keep record of the current geometry so we know what's changed */
+       req.changes.x = widget->core.x ;
+       req.changes.y = widget->core.y ;
+       req.changes.width = widget->core.width ;
+       req.changes.height = widget->core.height ;
+       req.changes.border_width = widget->core.border_width ;
+    }
+
+    if (!managed || !parentRealized) {
+       CALLGEOTAT(_XtGeoTrace(widget,
+                              "Not Managed or Parent not realized.\n"));
+       /* Don't get parent's manager involved--assume the answer is yes */
+       if (req.changeMask & XtCWQueryOnly) {
+           /* He was just asking, don't change anything, just tell him yes */
+           CALLGEOTAT(_XtGeoTrace(widget,"QueryOnly request\n"));
+           CALLGEOTAT(_XtGeoTab(-1));
+           CALLGEOTAT(_XtGeoTrace(widget,"just return XtGeometryYes.\n"));
+           return XtGeometryYes;
+       } else {
+           CALLGEOTAT(_XtGeoTrace(widget,
+                                  "Copy values from request to widget.\n"));
+           /* copy values from request to widget */
+           if (request->request_mode & CWX)
+               widget->core.x = request->x;
+           if (request->request_mode & CWY)
+               widget->core.y = request->y;
+           if (request->request_mode & CWWidth)
+               widget->core.width = request->width;
+           if (request->request_mode & CWHeight)
+               widget->core.height = request->height;
+           if (request->request_mode & CWBorderWidth)
+               widget->core.border_width = request->border_width;
+           if (!parentRealized) {
+               CALLGEOTAT(_XtGeoTab(-1));
+               CALLGEOTAT(_XtGeoTrace(widget,"and return XtGeometryYes.\n"));
+               return XtGeometryYes;
+           }
+           else returnCode = XtGeometryYes;
+       }
+    } else {
+       /* go ask the widget's geometry manager */
+       CALLGEOTAT(_XtGeoTrace(widget,
+                              "Go ask the parent geometry manager.\n"));
+       if (reply == (XtWidgetGeometry *) NULL) {
+           returnCode = (*manager)(widget, request, &junk);
+       } else {
+           returnCode = (*manager)(widget, request, reply);
+       }
+    }
+
+    /*
+     * If Unrealized, not a XtGeometryYes, or a query-only then we are done.
+     */
+
+    if ((returnCode != XtGeometryYes) ||
+       (req.changeMask & XtCWQueryOnly) || !XtIsRealized(widget)) {
+
+#ifdef XT_GEO_TATTLER
+       switch(returnCode){
+       case XtGeometryNo:
+           CALLGEOTAT(_XtGeoTab(-1));
+           CALLGEOTAT(_XtGeoTrace(widget,"\"%s\" returns XtGeometryNo.\n",
+                         (XtParent(widget))?XtName(XtParent(widget)):"Root"));
+            /* check for no change */
+            break ;
+       case XtGeometryDone:
+           CALLGEOTAT(_XtGeoTab(-1));
+           CALLGEOTAT(_XtGeoTrace(widget,"\"%s\" returns XtGeometryDone.\n",
+                       (XtParent(widget))?XtName(XtParent(widget)):"Root"));
+            /* check for no change in queryonly */
+            break ;
+       case XtGeometryAlmost:
+           CALLGEOTAT(_XtGeoTab(-1));
+           CALLGEOTAT(_XtGeoTrace(widget,"\"%s\" returns XtGeometryAlmost.\n",
+                        (XtParent(widget))?XtName(XtParent(widget)):"Root"));
+           CALLGEOTAT(_XtGeoTab(1));
+           CALLGEOTAT(_XtGeoTrace(widget,"Proposal: width %d height %d.\n",
+                          (reply)?reply->width:junk.width,
+                          (reply)?reply->height:junk.height));
+           CALLGEOTAT(_XtGeoTab(-1));
+
+            /* check for no change */
+            break ;
+       case XtGeometryYes:
+           if (req.changeMask & XtCWQueryOnly) {
+               CALLGEOTAT(_XtGeoTrace(widget,
+                               "QueryOnly specified, no configuration.\n"));
+           }
+            if (!XtIsRealized(widget)) {
+               CALLGEOTAT(_XtGeoTrace(widget,
+                                "\"%s\" not realized, no configuration.\n",
+                                XtName(widget)));
+           }
+           CALLGEOTAT(_XtGeoTab(-1));
+            CALLGEOTAT(_XtGeoTrace(widget,"\"%s\" returns XtGeometryYes.\n",
+                         (XtParent(widget))?XtName(XtParent(widget)):"Root"));
+           break ;
+       }
+#endif
+       return returnCode;
+    }
+
+    CALLGEOTAT(_XtGeoTab(-1));
+    CALLGEOTAT(_XtGeoTrace(widget,"\"%s\" returns XtGeometryYes.\n",
+                  (XtParent(widget))?XtName(XtParent(widget)):"Root"));
+
+    if (XtIsWidget(widget)) {  /* reconfigure the window (if needed) */
+
+       if (rgm) return returnCode;
+
+       if (req.changes.x != widget->core.x) {
+           req.changeMask |= CWX;
+           req.changes.x = widget->core.x;
+           CALLGEOTAT(_XtGeoTrace(widget,
+                                  "x changing to %d\n",widget->core.x));
+       }
+       if (req.changes.y != widget->core.y) {
+           req.changeMask |= CWY;
+           req.changes.y = widget->core.y;
+           CALLGEOTAT(_XtGeoTrace(widget,
+                                  "y changing to %d\n",widget->core.y));
+       }
+       if (req.changes.width != widget->core.width) {
+           req.changeMask |= CWWidth;
+           req.changes.width = widget->core.width;
+           CALLGEOTAT(_XtGeoTrace(widget,
+                                "width changing to %d\n",widget->core.width));
+       }
+       if (req.changes.height != widget->core.height) {
+           req.changeMask |= CWHeight;
+           req.changes.height = widget->core.height;
+           CALLGEOTAT(_XtGeoTrace(widget,
+                               "height changing to %d\n",widget->core.height));
+       }
+       if (req.changes.border_width != widget->core.border_width) {
+           req.changeMask |= CWBorderWidth;
+           req.changes.border_width = widget->core.border_width;
+           CALLGEOTAT(_XtGeoTrace(widget,
+                                  "border_width changing to %d\n",
+                                  widget->core.border_width));
+       }
+       if (req.changeMask & CWStackMode) {
+           req.changes.stack_mode = request->stack_mode;
+           CALLGEOTAT(_XtGeoTrace(widget,"stack_mode changing\n"));
+           if (req.changeMask & CWSibling) {
+               if (XtIsWidget(request->sibling))
+                   req.changes.sibling = XtWindow(request->sibling);
+               else
+                   req.changeMask &= ~(CWStackMode | CWSibling);
+           }
+       }
+
+#ifdef XT_GEO_TATTLER
+        if (req.changeMask) {
+           CALLGEOTAT(_XtGeoTrace(widget,
+                                  "XConfigure \"%s\"'s window.\n",
+                                  XtName(widget)));
+       } else {
+           CALLGEOTAT(_XtGeoTrace(widget,
+                            "No window configuration needed for \"%s\".\n",
+                            XtName(widget)));
+       }
+#endif
+
+       XConfigureWindow(XtDisplay(widget), XtWindow(widget),
+                        req.changeMask, &req.changes);
+    }
+    else {                     /* RectObj child of realized Widget */
+       *clear_rect_obj = TRUE;
+       CALLGEOTAT(_XtGeoTrace(widget,
+                              "ClearRectObj on \"%s\".\n",XtName(widget)));
+
+       ClearRectObjAreas((RectObj)widget, &req.changes);
+    }
+    hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));;
+    if (XtHasCallbacks(hookobj, XtNconfigureHook) == XtCallbackHasSome) {
+       req.type = XtHconfigure;
+       req.widget = widget;
+       XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.confighook_callbacks,
+               (XtPointer)&req);
+    }
+
+    return returnCode;
+} /* _XtMakeGeometryRequest */
+
+
+/* Public routines */
+
+XtGeometryResult XtMakeGeometryRequest (
+    Widget         widget,
+    XtWidgetGeometry *request,
+    XtWidgetGeometry *reply)
+{
+    Boolean junk;
+    XtGeometryResult r;
+    XtGeometryHookDataRec call_data;
+    Widget hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    if (XtHasCallbacks(hookobj, XtNgeometryHook) == XtCallbackHasSome) {
+       call_data.type = XtHpreGeometry;
+       call_data.widget = widget;
+       call_data.request = request;
+       XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.geometryhook_callbacks,
+               (XtPointer)&call_data);
+       call_data.result = r =
+           _XtMakeGeometryRequest(widget, request, reply, &junk);
+       call_data.type = XtHpostGeometry;
+       call_data.reply = reply;
+       XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.geometryhook_callbacks,
+               (XtPointer)&call_data);
+    } else {
+       r = _XtMakeGeometryRequest(widget, request, reply, &junk);
+    }
+    UNLOCK_APP(app);
+
+    return ((r == XtGeometryDone) ? XtGeometryYes : r);
+}
+
+XtGeometryResult
+XtMakeResizeRequest(
+    Widget     widget,
+    _XtDimension width,
+    _XtDimension height,
+    Dimension  *replyWidth,
+    Dimension  *replyHeight)
+{
+    XtWidgetGeometry request, reply;
+    XtGeometryResult r;
+    XtGeometryHookDataRec call_data;
+    Boolean junk;
+    Widget hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    request.request_mode = CWWidth | CWHeight;
+    request.width = width;
+    request.height = height;
+
+    if (XtHasCallbacks(hookobj, XtNgeometryHook) == XtCallbackHasSome) {
+       call_data.type = XtHpreGeometry;
+       call_data.widget = widget;
+       call_data.request = &request;
+       XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.geometryhook_callbacks,
+               (XtPointer)&call_data);
+       call_data.result = r =
+           _XtMakeGeometryRequest(widget, &request, &reply, &junk);
+       call_data.type = XtHpostGeometry;
+       call_data.reply = &reply;
+       XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.geometryhook_callbacks,
+               (XtPointer)&call_data);
+    } else {
+       r = _XtMakeGeometryRequest(widget, &request, &reply, &junk);
+    }
+    if (replyWidth != NULL) {
+       if (r == XtGeometryAlmost && reply.request_mode & CWWidth)
+           *replyWidth = reply.width;
+       else
+           *replyWidth = width;
+    }
+    if (replyHeight != NULL) {
+       if (r == XtGeometryAlmost && reply.request_mode & CWHeight)
+           *replyHeight = reply.height;
+       else
+           *replyHeight = height;
+    }
+    UNLOCK_APP(app);
+    return ((r == XtGeometryDone) ? XtGeometryYes : r);
+} /* XtMakeResizeRequest */
+
+void XtResizeWindow(
+    Widget w)
+{
+    XtConfigureHookDataRec req;
+    Widget hookobj;
+    WIDGET_TO_APPCON(w);
+
+    LOCK_APP(app);
+    if (XtIsRealized(w)) {
+       req.changes.width = w->core.width;
+       req.changes.height = w->core.height;
+       req.changes.border_width = w->core.border_width;
+       req.changeMask = CWWidth | CWHeight | CWBorderWidth;
+       XConfigureWindow(XtDisplay(w), XtWindow(w),
+           (unsigned) req.changeMask, &req.changes);
+       hookobj = XtHooksOfDisplay(XtDisplayOfObject(w));;
+       if (XtHasCallbacks(hookobj, XtNconfigureHook) == XtCallbackHasSome) {
+           req.type = XtHconfigure;
+           req.widget = w;
+           XtCallCallbackList(hookobj,
+                       ((HookObject)hookobj)->hooks.confighook_callbacks,
+                       (XtPointer)&req);
+       }
+    }
+    UNLOCK_APP(app);
+} /* XtResizeWindow */
+
+void XtResizeWidget(
+    Widget w,
+    _XtDimension width,
+    _XtDimension height,
+    _XtDimension borderWidth)
+{
+    XtConfigureWidget(w, w->core.x, w->core.y, width, height, borderWidth);
+} /* XtResizeWidget */
+
+void XtConfigureWidget(
+    Widget w,
+    _XtPosition x,
+    _XtPosition y,
+    _XtDimension width,
+    _XtDimension height,
+    _XtDimension borderWidth)
+{
+    XtConfigureHookDataRec req;
+    Widget hookobj;
+    XWindowChanges old;
+    WIDGET_TO_APPCON(w);
+
+    CALLGEOTAT(_XtGeoTrace(w,
+                   "\"%s\" is being configured by its parent \"%s\"\n",
+                  XtName(w),
+                  (XtParent(w))?XtName(XtParent(w)):"Root"));
+    CALLGEOTAT(_XtGeoTab(1));
+
+    LOCK_APP(app);
+    req.changeMask = 0;
+    if ((old.x = w->core.x) != x) {
+       CALLGEOTAT(_XtGeoTrace(w,"x move from %d to %d\n",w->core.x, x));
+       req.changes.x = w->core.x = x;
+       req.changeMask |= CWX;
+    }
+
+    if ((old.y = w->core.y) != y) {
+       CALLGEOTAT(_XtGeoTrace(w,"y move from %d to %d\n",w->core.y, y));
+       req.changes.y = w->core.y = y;
+       req.changeMask |= CWY;
+    }
+
+    if ((old.width = w->core.width) != width) {
+       CALLGEOTAT(_XtGeoTrace(w,
+                        "width move from %d to %d\n",w->core.width, width));
+       req.changes.width = w->core.width = width;
+       req.changeMask |= CWWidth;
+    }
+
+    if ((old.height = w->core.height) != height) {
+       CALLGEOTAT(_XtGeoTrace(w,
+                      "height move from %d to %d\n",w->core.height, height));
+       req.changes.height = w->core.height = height;
+       req.changeMask |= CWHeight;
+    }
+
+    if ((old.border_width = w->core.border_width) != borderWidth) {
+       CALLGEOTAT(_XtGeoTrace(w,"border_width move from %d to %d\n",
+                   w->core.border_width,borderWidth ));
+       req.changes.border_width = w->core.border_width = borderWidth;
+       req.changeMask |= CWBorderWidth;
+    }
+
+    if (req.changeMask != 0) {
+       if (XtIsRealized(w)) {
+           if (XtIsWidget(w)) {
+               CALLGEOTAT(_XtGeoTrace(w,
+                                  "XConfigure \"%s\"'s window\n",XtName(w)));
+               XConfigureWindow(XtDisplay(w), XtWindow(w),
+                                req.changeMask, &req.changes);
+           } else {
+               CALLGEOTAT(_XtGeoTrace(w,
+                              "ClearRectObj called on \"%s\"\n",XtName(w)));
+               ClearRectObjAreas((RectObj)w, &old);
+           }
+       }
+       hookobj = XtHooksOfDisplay(XtDisplayOfObject(w));;
+       if (XtHasCallbacks(hookobj, XtNconfigureHook) == XtCallbackHasSome) {
+           req.type = XtHconfigure;
+           req.widget = w;
+           XtCallCallbackList(hookobj,
+                       ((HookObject)hookobj)->hooks.confighook_callbacks,
+                       (XtPointer)&req);
+       }
+       {
+       XtWidgetProc resize;
+
+       LOCK_PROCESS;
+       resize = XtClass(w)->core_class.resize;
+       UNLOCK_PROCESS;
+       if ((req.changeMask & (CWWidth | CWHeight)) &&
+           resize != (XtWidgetProc) NULL) {
+           CALLGEOTAT(_XtGeoTrace(w,"Resize proc is called.\n"));
+           (*resize)(w);
+        }
+       }
+    } else {
+       CALLGEOTAT(_XtGeoTrace(w,"No change in configuration\n"));
+    }
+
+    CALLGEOTAT(_XtGeoTab(-1));
+    UNLOCK_APP(app);
+} /* XtConfigureWidget */
+
+void XtMoveWidget(
+    Widget w,
+    _XtPosition x,
+    _XtPosition y)
+{
+    XtConfigureWidget(w, x, y, w->core.width, w->core.height,
+                     w->core.border_width);
+} /* XtMoveWidget */
+
+void XtTranslateCoords(
+    register Widget w,
+    _XtPosition x,
+    _XtPosition y,
+    register Position *rootx,  /* return */
+    register Position *rooty)  /* return */
+{
+    Position garbagex, garbagey;
+    XtAppContext app = XtWidgetToApplicationContext(w);
+
+    LOCK_APP(app);
+    if (rootx == NULL) rootx = &garbagex;
+    if (rooty == NULL) rooty = &garbagey;
+
+    *rootx = x;
+    *rooty = y;
+
+    for (; w != NULL && ! XtIsShell(w); w = w->core.parent) {
+       *rootx += w->core.x + w->core.border_width;
+       *rooty += w->core.y + w->core.border_width;
+    }
+
+    if (w == NULL)
+        XtAppWarningMsg(app,
+               "invalidShell","xtTranslateCoords",XtCXtToolkitError,
+                "Widget has no shell ancestor",
+               (String *)NULL, (Cardinal *)NULL);
+    else {
+       Position x, y;
+       _XtShellGetCoordinates( w, &x, &y );
+       *rootx += x + w->core.border_width;
+       *rooty += y + w->core.border_width;
+    }
+    UNLOCK_APP(app);
+}
+
+XtGeometryResult XtQueryGeometry(
+    Widget widget,
+    register XtWidgetGeometry *intended, /* parent's changes; may be NULL */
+    XtWidgetGeometry *reply)   /* child's preferred geometry; never NULL */
+{
+    XtWidgetGeometry null_intended;
+    XtGeometryHandler query;
+    XtGeometryResult result;
+    WIDGET_TO_APPCON(widget);
+
+    CALLGEOTAT(_XtGeoTrace(widget,
+                    "\"%s\" is asking its preferred geometry to \"%s\".\n",
+                    (XtParent(widget))?XtName(XtParent(widget)):"Root",
+                    XtName(widget)));
+    CALLGEOTAT(_XtGeoTab(1));
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    query = XtClass(widget)->core_class.query_geometry;
+    UNLOCK_PROCESS;
+    reply->request_mode = 0;
+    if (query != NULL) {
+       if (intended == NULL) {
+           null_intended.request_mode = 0;
+           intended = &null_intended;
+#ifdef XT_GEO_TATTLER
+           CALLGEOTAT(_XtGeoTrace(widget,"without any constraint.\n"));
+       } else {
+           CALLGEOTAT(_XtGeoTrace(widget,
+                                  "with the following constraints:\n"));
+
+           if (intended->request_mode & CWX) {
+               CALLGEOTAT(_XtGeoTrace(widget," x = %d\n",intended->x));
+           }
+           if (intended->request_mode & CWY) {
+               CALLGEOTAT(_XtGeoTrace(widget," y = %d\n",intended->y));
+           }
+           if (intended->request_mode & CWWidth) {
+               CALLGEOTAT(_XtGeoTrace(widget,
+                                      " width = %d\n",intended->width));
+           }
+           if (intended->request_mode & CWHeight) {
+               CALLGEOTAT(_XtGeoTrace(widget,
+                                      " height = %d\n",intended->height));
+           }
+           if (intended->request_mode & CWBorderWidth) {
+               CALLGEOTAT(_XtGeoTrace(widget,
+                              " border_width = %d\n",intended->border_width));
+           }
+#endif
+       }
+
+       result = (*query) (widget, intended, reply);
+    }
+    else {
+       CALLGEOTAT(_XtGeoTrace(widget,"\"%s\" has no QueryGeometry proc, return the current state\n",XtName(widget)));
+
+       result = XtGeometryYes;
+    }
+
+#ifdef XT_GEO_TATTLER
+#define FillIn(mask, field) \
+       if (!(reply->request_mode & mask)) {\
+             reply->field = widget->core.field;\
+             _XtGeoTrace(widget," using core %s = %d.\n","field",\
+                                                      widget->core.field);\
+       } else {\
+             _XtGeoTrace(widget," replied %s = %d\n","field",\
+                                                  reply->field);\
+       }
+#else
+#define FillIn(mask, field) \
+       if (!(reply->request_mode & mask)) reply->field = widget->core.field;
+#endif
+
+    FillIn(CWX, x);
+    FillIn(CWY, y);
+    FillIn(CWWidth, width);
+    FillIn(CWHeight, height);
+    FillIn(CWBorderWidth, border_width);
+
+    CALLGEOTAT(_XtGeoTab(-1));
+#undef FillIn
+
+    if (!(reply->request_mode & CWStackMode))
+       reply->stack_mode = XtSMDontChange;
+    UNLOCK_APP(app);
+    return result;
+}
diff --git a/src/GetActKey.c b/src/GetActKey.c
new file mode 100644 (file)
index 0000000..cf1278e
--- /dev/null
@@ -0,0 +1,111 @@
+/*LINTLIBRARY*/
+
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+
+KeySym XtGetActionKeysym(
+    XEvent *event,
+    Modifiers *modifiers_return)
+{
+    TMKeyContext tm_context;
+    Modifiers modifiers;
+    KeySym keysym, retval;
+
+    LOCK_PROCESS;
+    tm_context= _XtGetPerDisplay(event->xany.display)->tm_context;
+    if (event->xany.type != KeyPress && event->xany.type != KeyRelease) {
+       UNLOCK_PROCESS;
+       return NoSymbol;
+    }
+    if (tm_context != NULL
+       && event == tm_context->event
+       && event->xany.serial == tm_context->serial ) {
+
+       if (modifiers_return != NULL)
+           *modifiers_return = tm_context->modifiers;
+       retval = tm_context->keysym;
+       UNLOCK_PROCESS;
+       return retval;
+    }
+
+    XtTranslateKeycode( event->xany.display, (KeyCode)event->xkey.keycode,
+                       event->xkey.state, &modifiers, &keysym );
+
+    if (modifiers_return != NULL)
+       *modifiers_return = event->xkey.state & modifiers;
+
+    UNLOCK_PROCESS;
+    return keysym;
+}
diff --git a/src/GetResList.c b/src/GetResList.c
new file mode 100644 (file)
index 0000000..c22725c
--- /dev/null
@@ -0,0 +1,201 @@
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "Intrinsic.h"
+
+/*
+ * XtGetResourceList(), XtGetConstraintResourceList()
+ */
+
+#define        TOXRMQUARK(p) ((XrmQuark)(long)(p))     /* avoid LP64 warnings */
+
+void XtGetResourceList(
+       WidgetClass widget_class,
+       XtResourceList *resources,
+       Cardinal *num_resources)
+{
+       int size;
+       register Cardinal i, dest = 0;
+       register XtResourceList *list, dlist;
+
+       LOCK_PROCESS;
+       size = widget_class->core_class.num_resources * sizeof(XtResource);
+       *resources = (XtResourceList) __XtMalloc((unsigned) size);
+
+       if (!widget_class->core_class.class_inited) {
+           /* Easy case */
+
+           (void) memmove((char *) *resources,
+                          (char *)widget_class->core_class.resources, size);
+           *num_resources = widget_class->core_class.num_resources;
+           UNLOCK_PROCESS;
+           return;
+       }
+
+       /* Nope, it's the hard case */
+
+       list = (XtResourceList *) widget_class->core_class.resources;
+       dlist = *resources;
+       for (i = 0; i < widget_class->core_class.num_resources; i++) {
+           if (list[i] != NULL) {
+               dlist[dest].resource_name = (String)
+                       XrmQuarkToString(TOXRMQUARK(list[i]->resource_name));
+               dlist[dest].resource_class = (String)
+                       XrmQuarkToString(TOXRMQUARK(list[i]->resource_class));
+               dlist[dest].resource_type = (String)
+                       XrmQuarkToString(TOXRMQUARK(list[i]->resource_type));
+               dlist[dest].resource_size = list[i]->resource_size;
+               /* trust that resource_offset isn't that big */
+               dlist[dest].resource_offset = (Cardinal)
+                       -((int)(list[i]->resource_offset + 1));
+               dlist[dest].default_type = (String)
+                       XrmQuarkToString(TOXRMQUARK(list[i]->default_type));
+               dlist[dest].default_addr = list[i]->default_addr;
+               dest++;
+           }
+       }
+       *num_resources = dest;
+       UNLOCK_PROCESS;
+}
+
+
+static Boolean ClassIsSubclassOf(WidgetClass class, WidgetClass superclass)
+{
+    for (; class != NULL; class = class->core_class.superclass) {
+       if (class == superclass) return True;
+    }
+    return False;
+}
+
+void XtGetConstraintResourceList(
+       WidgetClass widget_class,
+       XtResourceList *resources,
+       Cardinal *num_resources)
+{
+       int size;
+       register Cardinal i, dest = 0;
+       register XtResourceList *list, dlist;
+       ConstraintWidgetClass class = (ConstraintWidgetClass)widget_class;
+
+       LOCK_PROCESS;
+       if (   (class->core_class.class_inited &&
+               !(class->core_class.class_inited & ConstraintClassFlag))
+           || (!class->core_class.class_inited &&
+               !ClassIsSubclassOf(widget_class, constraintWidgetClass))
+           || class->constraint_class.num_resources == 0) {
+
+           *resources = NULL;
+           *num_resources = 0;
+           UNLOCK_PROCESS;
+           return;
+       }
+
+       size = class->constraint_class.num_resources * sizeof(XtResource);
+       *resources = (XtResourceList) __XtMalloc((unsigned) size);
+
+       if (!class->core_class.class_inited) {
+           /* Easy case */
+
+           (void) memmove((char *) *resources,
+                          (char *)class->constraint_class.resources, size);
+           *num_resources = class->constraint_class.num_resources;
+           UNLOCK_PROCESS;
+           return;
+       }
+
+       /* Nope, it's the hard case */
+
+       list = (XtResourceList *) class->constraint_class.resources;
+       dlist = *resources;
+       for (i = 0; i < class->constraint_class.num_resources; i++) {
+           if (list[i] != NULL) {
+               dlist[dest].resource_name = (String)
+                       XrmQuarkToString(TOXRMQUARK(list[i]->resource_name));
+               dlist[dest].resource_class = (String)
+                       XrmQuarkToString(TOXRMQUARK(list[i]->resource_class));
+               dlist[dest].resource_type = (String)
+                       XrmQuarkToString(TOXRMQUARK(list[i]->resource_type));
+               dlist[dest].resource_size = list[i]->resource_size;
+               /* trust that resource_offset isn't that big */
+               dlist[dest].resource_offset = (Cardinal)
+                       -((int)(list[i]->resource_offset + 1));
+               dlist[dest].default_type = (String)
+                       XrmQuarkToString(TOXRMQUARK(list[i]->default_type));
+               dlist[dest].default_addr = list[i]->default_addr;
+               dest++;
+           }
+       }
+       *num_resources = dest;
+       UNLOCK_PROCESS;
+}
diff --git a/src/GetValues.c b/src/GetValues.c
new file mode 100644 (file)
index 0000000..511b8d8
--- /dev/null
@@ -0,0 +1,260 @@
+/*LINTLIBRARY*/
+
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+
+static int GetValues(
+  char*                        base,           /* Base address to fetch values from */
+  XrmResourceList*      res,           /* The current resource values.      */
+  register Cardinal    num_resources,  /* number of items in resources      */
+  ArgList              args,           /* The resource values requested     */
+  Cardinal             num_args)       /* number of items in arg list       */
+{
+    register ArgList           arg;
+    register Cardinal          i;
+    register XrmName           argName;
+    register XrmResourceList*   xrmres;
+    int                                translation_arg_num = -1;
+    static XrmQuark QCallback = NULLQUARK;
+    static XrmQuark QTranslationTable = NULLQUARK;
+
+    LOCK_PROCESS;
+    if (QCallback == NULLQUARK) {
+       QCallback = XrmPermStringToQuark(XtRCallback);
+       QTranslationTable = XrmPermStringToQuark(XtRTranslationTable);
+    }
+    UNLOCK_PROCESS;
+
+    /* Resource lists should be in compiled form already  */
+
+    for (arg = args ; num_args != 0; num_args--, arg++) {
+       argName = StringToName(arg->name);
+       for (xrmres = res, i = 0; i < num_resources; i++, xrmres++) {
+           if (argName == (*xrmres)->xrm_name) {
+               /* hack; do special cases here instead of a get_values_hook
+                * because get_values_hook looses info as to
+                * whether arg->value == NULL for ancient compatibility
+                * mode in _XtCopyToArg.  It helps performance, too...
+                */
+               if ((*xrmres)->xrm_type == QCallback) {
+                   XtCallbackList callback = _XtGetCallbackList(
+                             (InternalCallbackList *)
+                             (base - (*xrmres)->xrm_offset - 1));
+                   _XtCopyToArg(
+                             (char*)&callback, &arg->value,
+                             (*xrmres)->xrm_size);
+               }
+               else if ((*xrmres)->xrm_type == QTranslationTable)
+                   translation_arg_num = (int) (arg - args);
+               else {
+                   _XtCopyToArg(
+                             base - (*xrmres)->xrm_offset - 1,
+                             &arg->value,
+                             (*xrmres)->xrm_size);
+               }
+               break;
+           }
+       }
+    }
+    return translation_arg_num;
+} /* GetValues */
+
+static void CallGetValuesHook(
+    WidgetClass          widget_class,
+    Widget       w,
+    ArgList      args,
+    Cardinal     num_args)
+{
+    WidgetClass superclass;
+    XtArgsProc get_values_hook;
+
+    LOCK_PROCESS;
+    superclass = widget_class->core_class.superclass;
+    UNLOCK_PROCESS;
+    if (superclass != NULL)
+       CallGetValuesHook (superclass, w, args, num_args);
+
+    LOCK_PROCESS;
+    get_values_hook = widget_class->core_class.get_values_hook;
+    UNLOCK_PROCESS;
+    if (get_values_hook != NULL)
+       (*get_values_hook) (w, args, &num_args);
+}
+
+
+
+static void CallConstraintGetValuesHook(
+    WidgetClass          widget_class,
+    Widget       w,
+    ArgList      args,
+    Cardinal     num_args)
+{
+    ConstraintClassExtension ext;
+
+    LOCK_PROCESS;
+    if (widget_class->core_class.superclass
+       ->core_class.class_inited & ConstraintClassFlag) {
+       CallConstraintGetValuesHook
+           (widget_class->core_class.superclass, w, args, num_args);
+    }
+
+    for (ext = (ConstraintClassExtension)((ConstraintWidgetClass)widget_class)
+                ->constraint_class.extension;
+        ext != NULL && ext->record_type != NULLQUARK;
+        ext = (ConstraintClassExtension)ext->next_extension);
+
+    if (ext != NULL) {
+       if (  ext->version == XtConstraintExtensionVersion
+             && ext->record_size == sizeof(ConstraintClassExtensionRec)) {
+           if (ext->get_values_hook != NULL)
+               (*(ext->get_values_hook)) (w, args, &num_args);
+       } else {
+           String params[1];
+           Cardinal num_params = 1;
+           params[0] = widget_class->core_class.class_name;
+           XtAppWarningMsg(XtWidgetToApplicationContext(w),
+                "invalidExtension", "xtCreateWidget", XtCXtToolkitError,
+                "widget class %s has invalid ConstraintClassExtension record",
+                params, &num_params);
+       }
+    }
+    UNLOCK_PROCESS;
+}
+
+
+void XtGetValues(
+    register Widget   w,
+    register ArgList  args,
+    register Cardinal num_args)
+{
+    WidgetClass wc;
+    int targ;
+    XtAppContext app = XtWidgetToApplicationContext(w);
+
+    if (num_args == 0) return;
+    if ((args == NULL) && (num_args != 0)) {
+       XtAppErrorMsg(app,
+               "invalidArgCount","xtGetValues",XtCXtToolkitError,
+            "Argument count > 0 on NULL argument list in XtGetValues",
+              (String *)NULL, (Cardinal *)NULL);
+    }
+
+    LOCK_APP(app);
+    wc = XtClass(w);
+    LOCK_PROCESS;
+    /* Get widget values */
+    targ = GetValues((char*)w, (XrmResourceList *) wc->core_class.resources,
+       wc->core_class.num_resources, args, num_args);
+    UNLOCK_PROCESS;
+    if (targ != -1 && XtIsWidget(w)) {
+       XtTranslations translations = _XtGetTranslationValue(w);
+       _XtCopyToArg((char*)&translations, &args[targ].value,
+                    sizeof(XtTranslations));
+    }
+
+    /* Get constraint values if necessary */
+    /* constraints may be NULL if constraint_size==0 */
+    if (XtParent(w) != NULL && !XtIsShell(w) && XtIsConstraint(XtParent(w)) &&
+       w->core.constraints) {
+       ConstraintWidgetClass cwc
+           = (ConstraintWidgetClass) XtClass(XtParent(w));
+       LOCK_PROCESS;
+       GetValues((char*)w->core.constraints,
+                 (XrmResourceList *)(cwc->constraint_class.resources),
+                 cwc->constraint_class.num_resources, args, num_args);
+       UNLOCK_PROCESS;
+    }
+    /* Notify any class procedures that we have performed get_values */
+    CallGetValuesHook(wc, w, args, num_args);
+
+    /* Notify constraint get_values if necessary */
+    if (XtParent(w) != NULL && !XtIsShell(w) && XtIsConstraint(XtParent(w)))
+       CallConstraintGetValuesHook(XtClass(XtParent(w)), w, args,num_args);
+    UNLOCK_APP(app);
+} /* XtGetValues */
+
+void XtGetSubvalues(
+  XtPointer        base,           /* Base address to fetch values from */
+  XtResourceList    resources,      /* The current resource values.      */
+  Cardinal         num_resources,  /* number of items in resources      */
+  ArgList          args,           /* The resource values requested     */
+  Cardinal         num_args)       /* number of items in arg list       */
+{
+    XrmResourceList* xrmres;
+    xrmres = _XtCreateIndirectionTable(resources, num_resources);
+    GetValues((char*)base, xrmres, num_resources, args, num_args);
+    XtFree((char *)xrmres);
+}
diff --git a/src/HookObj.c b/src/HookObj.c
new file mode 100644 (file)
index 0000000..8aefa53
--- /dev/null
@@ -0,0 +1,134 @@
+/*
+
+Copyright 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+/******************************************************************
+ *
+ * Hook Object Resources
+ *
+ ******************************************************************/
+
+static XtResource resources[] = {
+  { XtNcreateHook, XtCCallback, XtRCallback, sizeof(XtPointer),
+    XtOffsetOf(HookObjRec, hooks.createhook_callbacks),
+    XtRCallback, (XtPointer)NULL},
+  { XtNchangeHook, XtCCallback, XtRCallback, sizeof(XtPointer),
+    XtOffsetOf(HookObjRec, hooks.changehook_callbacks),
+    XtRCallback, (XtPointer)NULL},
+  { XtNconfigureHook, XtCCallback, XtRCallback, sizeof(XtPointer),
+    XtOffsetOf(HookObjRec, hooks.confighook_callbacks),
+    XtRCallback, (XtPointer)NULL},
+  { XtNgeometryHook, XtCCallback, XtRCallback, sizeof(XtPointer),
+    XtOffsetOf(HookObjRec, hooks.geometryhook_callbacks),
+    XtRCallback, (XtPointer)NULL},
+  { XtNdestroyHook, XtCCallback, XtRCallback, sizeof(XtPointer),
+    XtOffsetOf(HookObjRec, hooks.destroyhook_callbacks),
+    XtRCallback, (XtPointer)NULL},
+  { XtNshells, XtCReadOnly, XtRWidgetList, sizeof(WidgetList),
+    XtOffsetOf(HookObjRec, hooks.shells), XtRImmediate, (XtPointer) NULL },
+  { XtNnumShells, XtCReadOnly, XtRCardinal, sizeof(Cardinal),
+    XtOffsetOf(HookObjRec, hooks.num_shells), XtRImmediate, (XtPointer) 0 }
+};
+
+static void GetValuesHook(Widget widget, ArgList args, Cardinal *num_args);
+static void Initialize(Widget req, Widget new, ArgList args,
+                       Cardinal *num_args);
+
+externaldef(hookobjclassrec) HookObjClassRec hookObjClassRec = {
+  { /* Object Class Part */
+    /* superclass        */    (WidgetClass)&objectClassRec,
+    /* class_name        */    "Hook",
+    /* widget_size       */    sizeof(HookObjRec),
+    /* class_initialize   */    NULL,
+    /* class_part_initialize*/ NULL,
+    /* class_inited       */   FALSE,
+    /* initialize        */    Initialize,
+    /* initialize_hook    */   NULL,
+    /* realize           */    NULL,
+    /* actions           */    NULL,
+    /* num_actions       */    0,
+    /* resources         */    resources,
+    /* num_resources     */    XtNumber(resources),
+    /* xrm_class         */    NULLQUARK,
+    /* compress_motion   */    FALSE,
+    /* compress_exposure  */   TRUE,
+    /* compress_enterleave*/   FALSE,
+    /* visible_interest          */    FALSE,
+    /* destroy           */    NULL,
+    /* resize            */    NULL,
+    /* expose            */    NULL,
+    /* set_values        */    NULL,
+    /* set_values_hook    */   NULL,
+    /* set_values_almost  */   NULL,
+    /* get_values_hook    */   GetValuesHook,
+    /* accept_focus      */    NULL,
+    /* version           */    XtVersion,
+    /* callback_offsets   */    NULL,
+    /* tm_table           */    NULL,
+    /* query_geometry      */  NULL,
+    /* display_accelerator  */ NULL,
+    /* extension           */  NULL
+  },
+  { /* HookObj Class Part */
+    /* unused               */ 0
+  }
+};
+
+externaldef(hookObjectClass) WidgetClass hookObjectClass =
+       (WidgetClass)&hookObjClassRec;
+
+static void FreeShellList(
+    Widget w,
+    XtPointer closure,
+    XtPointer call_data)
+{
+    HookObject h = (HookObject)w;
+    if (h->hooks.shells != NULL)
+       XtFree((char*)h->hooks.shells);
+}
+
+static void Initialize(
+    Widget req,
+    Widget new,
+    ArgList args,
+    Cardinal* num_args)
+{
+    HookObject w = (HookObject) new;
+    w->hooks.max_shells = 0;
+    XtAddCallback (new, XtNdestroyCallback, FreeShellList, (XtPointer) NULL);
+}
+
+static void GetValuesHook(
+    Widget widget,
+    ArgList args,
+    Cardinal* num_args)
+{
+    /* get the XtNshells and XtNnumShells pseudo-resources */
+}
diff --git a/src/Hooks.c b/src/Hooks.c
new file mode 100644 (file)
index 0000000..bf26a13
--- /dev/null
@@ -0,0 +1,155 @@
+/*
+
+Copyright 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+/*LINTLIBRARY*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "CreateI.h"
+
+static void FreeBlockHookList(
+    Widget widget,             /* unused (and invalid) */
+    XtPointer closure,         /* ActionHook* */
+    XtPointer call_data)       /* unused */
+{
+    BlockHook list = *(BlockHook*)closure;
+    while (list != NULL) {
+       BlockHook next = list->next;
+       XtFree( (XtPointer)list );
+       list = next;
+    }
+}
+
+
+XtBlockHookId XtAppAddBlockHook(
+    XtAppContext app,
+    XtBlockHookProc proc,
+    XtPointer closure)
+{
+    BlockHook hook = XtNew(BlockHookRec);
+    LOCK_APP(app);
+    hook->next = app->block_hook_list;
+    hook->app = app;
+    hook->proc = proc;
+    hook->closure = closure;
+    if (app->block_hook_list == NULL) {
+       _XtAddCallback( &app->destroy_callbacks,
+                       FreeBlockHookList,
+                       (XtPointer)&app->block_hook_list
+                     );
+    }
+    app->block_hook_list = hook;
+    UNLOCK_APP(app);
+    return (XtBlockHookId)hook;
+}
+
+
+void XtRemoveBlockHook(
+    XtBlockHookId id)
+{
+    BlockHook *p, hook = (BlockHook)id;
+    XtAppContext app = hook->app;
+    LOCK_APP(app);
+    for (p = &app->block_hook_list; p != NULL && *p != hook; p = &(*p)->next);
+    if (p == NULL) {
+#ifdef DEBUG
+       XtAppWarningMsg(app, "badId", "xtRemoveBlockHook", XtCXtToolkitError,
+                       "XtRemoveBlockHook called with bad or old hook id",
+                       (String*)NULL, (Cardinal*)NULL);
+#endif /*DEBUG*/
+       UNLOCK_APP(app);
+       return;
+    }
+    *p = hook->next;
+    XtFree( (XtPointer)hook );
+    UNLOCK_APP(app);
+}
+
+static void DeleteShellFromHookObj(
+    Widget shell,
+    XtPointer closure,
+    XtPointer call_data)
+{
+    /* app_con is locked when this function is called */
+    Cardinal ii, jj;
+    HookObject ho = (HookObject) closure;
+
+    for (ii = 0; ii < ho->hooks.num_shells; ii++)
+       if (ho->hooks.shells[ii] == shell) {
+           /* collapse the list */
+           for (jj = ii; jj < ho->hooks.num_shells; jj++) {
+               if ((jj+1) < ho->hooks.num_shells)
+                   ho->hooks.shells[jj] = ho->hooks.shells[jj+1];
+           }
+           break;
+       }
+    ho->hooks.num_shells--;
+}
+
+#define SHELL_INCR 4
+
+void _XtAddShellToHookObj(
+    Widget shell)
+{
+    /* app_con is locked when this function is called */
+    HookObject ho = (HookObject) XtHooksOfDisplay(XtDisplay(shell));
+
+    if (ho->hooks.num_shells == ho->hooks.max_shells) {
+       ho->hooks.max_shells += SHELL_INCR;
+       ho->hooks.shells =
+           (WidgetList)XtRealloc((char*)ho->hooks.shells,
+               ho->hooks.max_shells * sizeof (Widget));
+    }
+    ho->hooks.shells[ho->hooks.num_shells++] = shell;
+
+    XtAddCallback(shell, XtNdestroyCallback, DeleteShellFromHookObj,
+                 (XtPointer)ho);
+}
+
+Boolean _XtIsHookObject(
+    Widget widget)
+{
+    return (widget->core.widget_class == hookObjectClass);
+}
+
+Widget XtHooksOfDisplay(
+    Display* dpy)
+{
+    Widget retval;
+    XtPerDisplay pd;
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    pd = _XtGetPerDisplay(dpy);
+    if (pd->hook_object == NULL)
+       pd->hook_object =
+           _XtCreateHookObj((Screen*)DefaultScreenOfDisplay(dpy));
+    retval = pd->hook_object;
+    UNLOCK_APP(app);
+    return retval;
+}
diff --git a/src/Initialize.c b/src/Initialize.c
new file mode 100644 (file)
index 0000000..9783deb
--- /dev/null
@@ -0,0 +1,1057 @@
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+/* Make sure all wm properties can make it out of the resource manager */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+#include "CoreP.h"
+#include "ShellP.h"
+#include <stdio.h>
+#include <X11/Xlocale.h>
+#ifdef XTHREADS
+#include <X11/Xthreads.h>
+#endif
+#ifndef WIN32
+#define X_INCLUDE_PWD_H
+#define XOS_USE_XT_LOCKING
+#include <X11/Xos_r.h>
+#endif
+
+#include <stdlib.h>
+
+#if (defined(SUNSHLIB) || defined(AIXSHLIB)) && defined(SHAREDCODE)
+/*
+ * If used as a shared library, generate code under a different name so that
+ * the stub routines in sharedlib.c get loaded into the application binary.
+ */
+#define XtToolkitInitialize _XtToolkitInitialize
+#define XtOpenApplication _XtOpenApplication
+#define XtAppInitialize _XtAppInitialize
+#define XtInitialize _XtInitialize
+#endif /* (SUNSHLIB || AIXSHLIB) && SHAREDCODE */
+
+/*
+ * hpux
+ * Hand-patched versions of HP-UX prior to version 7.0 can usefully add
+ * -DUSE_UNAME in the appropriate config file to get long hostnames.
+ */
+
+#ifdef USG
+#define USE_UNAME
+#endif
+
+#ifdef USE_UNAME
+#include <sys/utsname.h>
+#endif
+
+/* some unspecified magic number of expected search levels for Xrm */
+#define SEARCH_LIST_SIZE 1000
+
+/*
+ This is a set of default records describing the command line arguments that
+ Xlib will parse and set into the resource data base.
+
+ This list is applied before the users list to enforce these defaults.  This is
+ policy, which the toolkit avoids but I hate differing programs at this level.
+*/
+
+static XrmOptionDescRec const opTable[] = {
+{"+rv",                "*reverseVideo", XrmoptionNoArg,        (XtPointer) "off"},
+{"+synchronous","*synchronous",        XrmoptionNoArg,         (XtPointer) "off"},
+{"-background",        "*background",  XrmoptionSepArg,        (XtPointer) NULL},
+{"-bd",                "*borderColor", XrmoptionSepArg,        (XtPointer) NULL},
+{"-bg",                "*background",  XrmoptionSepArg,        (XtPointer) NULL},
+{"-bordercolor","*borderColor",        XrmoptionSepArg,        (XtPointer) NULL},
+{"-borderwidth",".borderWidth",        XrmoptionSepArg,        (XtPointer) NULL},
+{"-bw",                ".borderWidth", XrmoptionSepArg,        (XtPointer) NULL},
+{"-display",   ".display",     XrmoptionSepArg,        (XtPointer) NULL},
+{"-fg",                "*foreground",  XrmoptionSepArg,        (XtPointer) NULL},
+{"-fn",                "*font",        XrmoptionSepArg,        (XtPointer) NULL},
+{"-font",      "*font",        XrmoptionSepArg,        (XtPointer) NULL},
+{"-foreground",        "*foreground",  XrmoptionSepArg,        (XtPointer) NULL},
+{"-geometry",  ".geometry",    XrmoptionSepArg,        (XtPointer) NULL},
+{"-iconic",    ".iconic",      XrmoptionNoArg,         (XtPointer) "on"},
+{"-name",      ".name",        XrmoptionSepArg,        (XtPointer) NULL},
+{"-reverse",   "*reverseVideo", XrmoptionNoArg,        (XtPointer) "on"},
+{"-rv",                "*reverseVideo", XrmoptionNoArg,        (XtPointer) "on"},
+{"-selectionTimeout",
+               ".selectionTimeout", XrmoptionSepArg,   (XtPointer) NULL},
+{"-synchronous","*synchronous",        XrmoptionNoArg,         (XtPointer) "on"},
+{"-title",     ".title",       XrmoptionSepArg,        (XtPointer) NULL},
+{"-xnllanguage",".xnlLanguage",        XrmoptionSepArg,        (XtPointer) NULL},
+{"-xrm",       NULL,           XrmoptionResArg,        (XtPointer) NULL},
+{"-xtsessionID",".sessionID",  XrmoptionSepArg,        (XtPointer) NULL},
+};
+
+
+/*
+ * GetHostname - emulates gethostname() on non-bsd systems.
+ */
+
+static void GetHostname (
+    char *buf,
+    int maxlen)
+{
+#ifdef USE_UNAME
+    int len;
+    struct utsname name;
+
+    if (maxlen <= 0 || buf == NULL)
+       return;
+
+    uname (&name);
+    len = strlen (name.nodename);
+    if (len >= maxlen) len = maxlen;
+    (void) strncpy (buf, name.nodename, len-1);
+    buf[len-1] = '\0';
+#else
+    if (maxlen <= 0 || buf == NULL)
+       return;
+
+    buf[0] = '\0';
+    (void) gethostname (buf, maxlen);
+    buf [maxlen - 1] = '\0';
+#endif
+}
+
+
+#ifdef SUNSHLIB
+void _XtInherit(void)
+{
+    extern void __XtInherit();
+    __XtInherit();
+}
+#define _XtInherit __XtInherit
+#endif
+
+
+#if defined (WIN32) || defined(__CYGWIN__)
+/*
+ * The Symbol _XtInherit is used in two different manners.
+ * First it could be used as a generic function and second
+ * as an absolute address reference, which will be used to
+ * check the initialisation process of several other libraries.
+ * Because of this the symbol must be accessable by all
+ * client dll's and applications.  In unix environments
+ * this is no problem, because the used shared libraries
+ * format (elf) supports this immediatly.  Under Windows
+ * this isn't true, because a functions address in a dll
+ * is different from the same function in another dll or
+ * applications, because the used Portable Executable
+ * File adds a code stub to each client to provide the
+ * exported symbol name.  This stub uses an indirect
+ * pointer to get the original symbol address, which is
+ * then jumped to, like in this example:
+ *
+ * --- client ---                                     --- dll ----
+ *  ...
+ *  call foo
+ *
+ * foo: jmp (*_imp_foo)               ---->           foo: ....
+ *      nop
+ *      nop
+ *
+ * _imp_foo: .long <index of foo in dll export table, is
+ *                 set to the real address by the runtime linker>
+ *
+ * Now it is clear why the clients symbol foo isn't the same
+ * as in the dll and we can think about how to deal which
+ * this two above mentioned requirements, to export this
+ * symbol to all clients and to allow calling this symbol
+ * as a function.  The solution I've used exports the
+ * symbol _XtInherit as data symbol, because global data
+ * symbols are exported to all clients.  But how to deal
+ * with the second requirement, that this symbol should
+ * be used as function.  The Trick is to build a little
+ * code stub in the data section in the exact manner as
+ * above explained.  This is done with the assembler code
+ * below.
+ *
+ * Ralf Habacker
+ *
+ * References:
+ * msdn          http://msdn.microsoft.com/msdnmag/issues/02/02/PE/PE.asp
+ * cygwin-xfree: http://www.cygwin.com/ml/cygwin-xfree/2003-10/msg00000.html
+ */
+
+asm (".data\n\
+ .globl __XtInherit        \n\
+ __XtInherit:      jmp *_y \n\
+  _y: .long ___XtInherit   \n\
+    .text                 \n");
+
+#define _XtInherit __XtInherit
+#endif
+
+
+void _XtInherit(void)
+{
+    XtErrorMsg("invalidProcedure","inheritanceProc",XtCXtToolkitError,
+            "Unresolved inheritance operation",
+              (String *)NULL, (Cardinal *)NULL);
+}
+
+
+void XtToolkitInitialize(void)
+{
+    static Boolean initialized = False;
+
+    LOCK_PROCESS;
+    if (initialized) {
+       UNLOCK_PROCESS;
+       return;
+    }
+    initialized = True;
+    UNLOCK_PROCESS;
+    /* Resource management initialization */
+    XrmInitialize();
+    _XtResourceListInitialize();
+
+    /* Other intrinsic intialization */
+    _XtConvertInitialize();
+    _XtEventInitialize();
+    _XtTranslateInitialize();
+
+    /* Some apps rely on old (broken) XtAppPeekEvent behavior */
+    if(getenv("XTAPPPEEKEVENT_SKIPTIMER"))
+       XtAppPeekEvent_SkipTimer = True;
+    else
+       XtAppPeekEvent_SkipTimer = False;
+}
+
+
+String _XtGetUserName(
+    String dest,
+    int len)
+{
+#ifdef WIN32
+    String ptr = NULL;
+
+    if ((ptr = getenv("USERNAME"))) {
+       (void) strncpy (dest, ptr, len-1);
+       dest[len-1] = '\0';
+    } else
+       *dest = '\0';
+#else
+#ifdef X_NEEDS_PWPARAMS
+    _Xgetpwparams pwparams;
+#endif
+    struct passwd *pw;
+    char* ptr;
+
+    if ((ptr = getenv("USER"))) {
+       (void) strncpy (dest, ptr, len-1);
+       dest[len-1] = '\0';
+    } else {
+       if ((pw = _XGetpwuid(getuid(),pwparams)) != NULL) {
+           (void) strncpy (dest, pw->pw_name, len-1);
+           dest[len-1] = '\0';
+       } else
+           *dest = '\0';
+    }
+#endif
+    return dest;
+}
+
+
+static String GetRootDirName(
+    String dest,
+    int len)
+{
+#ifdef WIN32
+    register char *ptr1;
+    register char *ptr2 = NULL;
+    int len1 = 0, len2 = 0;
+
+    if (ptr1 = getenv("HOME")) {       /* old, deprecated */
+       len1 = strlen (ptr1);
+    } else if ((ptr1 = getenv("HOMEDRIVE")) && (ptr2 = getenv("HOMEDIR"))) {
+       len1 = strlen (ptr1);
+       len2 = strlen (ptr2);
+    } else if (ptr2 = getenv("USERNAME")) {
+       len1 = strlen (ptr1 = "/users/");
+       len2 = strlen (ptr2);
+    }
+    if ((len1 + len2 + 1) < len)
+       sprintf (dest, "%s%s", ptr1, (ptr2) ? ptr2 : "");
+    else
+       *dest = '\0';
+#else
+#ifdef X_NEEDS_PWPARAMS
+    _Xgetpwparams pwparams;
+#endif
+    struct passwd *pw;
+    static char *ptr;
+
+    if (len <= 0 || dest == NULL)
+       return NULL;
+
+    if ((ptr = getenv("HOME"))) {
+       (void) strncpy (dest, ptr, len-1);
+       dest[len-1] = '\0';
+    } else {
+       if ((ptr = getenv("USER")))
+           pw = _XGetpwnam(ptr,pwparams);
+       else
+           pw = _XGetpwuid(getuid(),pwparams);
+       if (pw != NULL) {
+           (void) strncpy (dest, pw->pw_dir, len-1);
+           dest[len-1] = '\0';
+       } else
+           *dest = '\0';
+    }
+#endif
+    return dest;
+}
+
+static void CombineAppUserDefaults(
+    Display *dpy,
+    XrmDatabase *pdb)
+{
+    char* filename;
+    char* path = NULL;
+    Boolean deallocate = False;
+
+    if (!(path = getenv("XUSERFILESEARCHPATH"))) {
+#if !defined(WIN32) || !defined(__MINGW32__)
+       char *old_path;
+       char homedir[PATH_MAX];
+       GetRootDirName(homedir, PATH_MAX);
+       if (!(old_path = getenv("XAPPLRESDIR"))) {
+           XtAsprintf(&path,
+                      "%s/%%L/%%N%%C:%s/%%l/%%N%%C:%s/%%N%%C:%s/%%L/%%N:%s/%%l/%%N:%s/%%N",
+                      homedir, homedir, homedir, homedir, homedir, homedir);
+       } else {
+           XtAsprintf(&path,
+                      "%s/%%L/%%N%%C:%s/%%l/%%N%%C:%s/%%N%%C:%s/%%N%%C:%s/%%L/%%N:%s/%%l/%%N:%s/%%N:%s/%%N",
+                      old_path, old_path, old_path, homedir,
+                      old_path, old_path, old_path, homedir);
+       }
+       deallocate = True;
+#endif
+    }
+
+    filename = XtResolvePathname(dpy, NULL, NULL, NULL, path, NULL, 0, NULL);
+    if (filename) {
+       (void)XrmCombineFileDatabase(filename, pdb, False);
+       XtFree(filename);
+    }
+
+    if (deallocate)
+       XtFree(path);
+}
+
+static void CombineUserDefaults(
+    Display *dpy,
+    XrmDatabase *pdb)
+{
+#ifdef __MINGW32__
+    const char *slashDotXdefaults = "/Xdefaults";
+#else
+    const char *slashDotXdefaults = "/.Xdefaults";
+#endif
+    char *dpy_defaults = XResourceManagerString(dpy);
+
+    if (dpy_defaults) {
+       XrmCombineDatabase(XrmGetStringDatabase(dpy_defaults), pdb, False);
+    } else {
+       char filename[PATH_MAX];
+       (void) GetRootDirName(filename,
+                       PATH_MAX - strlen (slashDotXdefaults) - 1);
+       (void) strcat(filename, slashDotXdefaults);
+       (void)XrmCombineFileDatabase(filename, pdb, False);
+    }
+}
+
+/*ARGSUSED*/
+static Bool StoreDBEntry(
+    XrmDatabase                *db,
+    XrmBindingList      bindings,
+    XrmQuarkList       quarks,
+    XrmRepresentation   *type,
+    XrmValuePtr                value,
+    XPointer           data)
+{
+    XrmQPutResource((XrmDatabase *)data, bindings, quarks, *type, value);
+    return False;
+}
+
+static XrmDatabase CopyDB(XrmDatabase db)
+{
+    XrmDatabase copy = NULL;
+    XrmQuark empty = NULLQUARK;
+
+    XrmEnumerateDatabase(db, &empty, &empty, XrmEnumAllLevels,
+                        StoreDBEntry, (XPointer)&copy);
+    return copy;
+}
+
+/*ARGSUSED*/
+static String _XtDefaultLanguageProc(
+    Display   *dpy,    /* unused */
+    String     xnl,
+    XtPointer  closure)        /* unused */
+{
+    if (! setlocale(LC_ALL, xnl))
+       XtWarning("locale not supported by C library, locale unchanged");
+
+    if (! XSupportsLocale()) {
+       XtWarning("locale not supported by Xlib, locale set to C");
+       setlocale(LC_ALL, "C");
+    }
+    if (! XSetLocaleModifiers(""))
+       XtWarning("X locale modifiers not supported, using default");
+
+    return setlocale(LC_ALL, NULL); /* re-query in case overwritten */
+}
+
+XtLanguageProc XtSetLanguageProc(
+    XtAppContext      app,
+    XtLanguageProc    proc,
+    XtPointer         closure)
+{
+    XtLanguageProc    old;
+
+    if (!proc) {
+       proc = _XtDefaultLanguageProc;
+       closure = NULL;
+    }
+
+    if (app) {
+       LOCK_APP(app);
+       LOCK_PROCESS;
+       /* set langProcRec only for this application context */
+        old = app->langProcRec.proc;
+        app->langProcRec.proc = proc;
+        app->langProcRec.closure = closure;
+       UNLOCK_PROCESS;
+       UNLOCK_APP(app);
+    } else {
+       /* set langProcRec for all application contexts */
+        ProcessContext process;
+
+       LOCK_PROCESS;
+        process = _XtGetProcessContext();
+        old = process->globalLangProcRec.proc;
+       process->globalLangProcRec.proc = proc;
+       process->globalLangProcRec.closure = closure;
+        app = process->appContextList;
+        while (app) {
+            app->langProcRec.proc = proc;
+            app->langProcRec.closure = closure;
+           app = app->next;
+        }
+       UNLOCK_PROCESS;
+    }
+    return (old ? old : _XtDefaultLanguageProc);
+}
+
+XrmDatabase XtScreenDatabase(
+    Screen *screen)
+{
+    int scrno;
+    Bool doing_def;
+    XrmDatabase db, olddb;
+    XtPerDisplay pd;
+    Status do_fallback;
+    char *scr_resources;
+    Display *dpy = DisplayOfScreen(screen);
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    if (screen == DefaultScreenOfDisplay(dpy)) {
+       scrno = DefaultScreen(dpy);
+       doing_def = True;
+    } else {
+       scrno = XScreenNumberOfScreen(screen);
+       doing_def = False;
+    }
+    pd = _XtGetPerDisplay(dpy);
+    if ((db = pd->per_screen_db[scrno])) {
+       UNLOCK_PROCESS;
+       UNLOCK_APP(app);
+       return (doing_def ? XrmGetDatabase(dpy) : db);
+    }
+    scr_resources = XScreenResourceString(screen);
+
+    if (ScreenCount(dpy) == 1) {
+       db = pd->cmd_db;
+       pd->cmd_db = NULL;
+    } else {
+       db = CopyDB(pd->cmd_db);
+    }
+    {   /* Environment defaults */
+       char    filenamebuf[PATH_MAX];
+       char    *filename;
+
+       if (!(filename = getenv("XENVIRONMENT"))) {
+           int len;
+#ifdef __MINGW32__
+           const char *slashDotXdefaultsDash = "/Xdefaults-";
+#else
+           const char *slashDotXdefaultsDash = "/.Xdefaults-";
+#endif
+
+           (void) GetRootDirName(filename = filenamebuf,
+                       PATH_MAX - strlen (slashDotXdefaultsDash) - 1);
+           (void) strcat(filename, slashDotXdefaultsDash);
+           len = strlen(filename);
+           GetHostname (filename+len, PATH_MAX-len);
+       }
+       (void)XrmCombineFileDatabase(filename, &db, False);
+    }
+    if (scr_resources)
+    {   /* Screen defaults */
+       XrmCombineDatabase(XrmGetStringDatabase(scr_resources), &db, False);
+       XFree(scr_resources);
+    }
+    /* Server or host defaults */
+    if (!pd->server_db)
+       CombineUserDefaults(dpy, &db);
+    else {
+       (void) XrmCombineDatabase(pd->server_db, &db, False);
+       pd->server_db = NULL;
+    }
+
+    if (!db)
+       db = XrmGetStringDatabase("");
+    pd->per_screen_db[scrno] = db;
+    olddb = XrmGetDatabase(dpy);
+    /* set database now, for XtResolvePathname to use */
+    XrmSetDatabase(dpy, db);
+    CombineAppUserDefaults(dpy, &db);
+    do_fallback = 1;
+    {   /* System app-defaults */
+       char    *filename;
+
+       if ((filename = XtResolvePathname(dpy, "app-defaults",
+                                        NULL, NULL, NULL, NULL, 0, NULL))) {
+           do_fallback = !XrmCombineFileDatabase(filename, &db, False);
+           XtFree(filename);
+       }
+    }
+    /* now restore old database, if need be */
+    if (!doing_def)
+       XrmSetDatabase(dpy, olddb);
+    if (do_fallback && pd->appContext->fallback_resources)
+    {   /* Fallback defaults */
+        XrmDatabase fdb = NULL;
+       String *res;
+
+       for (res = pd->appContext->fallback_resources; *res; res++)
+           XrmPutLineResource(&fdb, *res);
+       (void)XrmCombineDatabase(fdb, &db, False);
+    }
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+    return db;
+}
+
+/*
+ * Merge two option tables, allowing the second to over-ride the first,
+ * so that ambiguous abbreviations can be noticed.  The merge attempts
+ * to make the resulting table lexicographically sorted, but succeeds
+ * only if the first source table is sorted.  Though it _is_ recommended
+ * (for optimizations later in XrmParseCommand), it is not required
+ * that either source table be sorted.
+ *
+ * Caller is responsible for freeing the returned option table.
+ */
+
+static void _MergeOptionTables(
+    const XrmOptionDescRec *src1,
+    Cardinal num_src1,
+    const XrmOptionDescRec *src2,
+    Cardinal num_src2,
+    XrmOptionDescRec **dst,
+    Cardinal *num_dst)
+{
+    XrmOptionDescRec *table, *endP;
+    register XrmOptionDescRec *opt1, *whereP, *dstP;
+    register const XrmOptionDescRec *opt2;
+    int i1;
+    Cardinal i2;
+    int dst_len, order;
+    Boolean found;
+    enum {Check, NotSorted, IsSorted} sort_order = Check;
+
+    *dst = table = (XrmOptionDescRec*)
+       __XtMalloc( sizeof(XrmOptionDescRec) * (num_src1 + num_src2) );
+
+    (void) memmove(table, src1, sizeof(XrmOptionDescRec) * num_src1 );
+    if (num_src2 == 0) {
+       *num_dst = num_src1;
+       return;
+    }
+    endP = &table[dst_len = num_src1];
+    for (opt2 = src2, i2= 0; i2 < num_src2; opt2++, i2++) {
+       found = False;
+       whereP = endP-1;        /* assume new option goes at the end */
+       for (opt1 = table, i1 = 0; i1 < dst_len; opt1++, i1++) {
+           /* have to walk the entire new table so new list is ordered
+              (if src1 was ordered) */
+           if (sort_order == Check && i1 > 0
+               && strcmp(opt1->option, (opt1-1)->option) < 0)
+               sort_order = NotSorted;
+           if ((order = strcmp(opt1->option, opt2->option)) == 0) {
+               /* same option names; just overwrite opt1 with opt2 */
+               *opt1 = *opt2;
+               found = True;
+               break;
+               }
+           /* else */
+           if (sort_order == IsSorted && order > 0) {
+               /* insert before opt1 to preserve order */
+               /* shift rest of table forward to make room for new entry */
+               for (dstP = endP++; dstP > opt1; dstP--)
+                   *dstP = *(dstP-1);
+               *opt1 = *opt2;
+               dst_len++;
+               found = True;
+               break;
+           }
+           /* else */
+           if (order < 0)
+               /* opt2 sorts after opt1, so remember this position */
+               whereP = opt1;
+       }
+       if (sort_order == Check && i1 == dst_len)
+           sort_order = IsSorted;
+       if (!found) {
+          /* when we get here, whereP points to the last entry in the
+             destination that sorts before "opt2".  Shift rest of table
+             forward and insert "opt2" after whereP. */
+           whereP++;
+           for (dstP = endP++; dstP > whereP; dstP--)
+               *dstP = *(dstP-1);
+           *whereP = *opt2;
+           dst_len++;
+       }
+    }
+    *num_dst = dst_len;
+}
+
+
+/* NOTE: name, class, and type must be permanent strings */
+static Boolean _GetResource(
+    Display *dpy,
+    XrmSearchList list,
+    String name,
+    String class,
+    String type,
+    XrmValue* value)
+{
+    XrmRepresentation db_type;
+    XrmValue db_value;
+    XrmName Qname = XrmPermStringToQuark(name);
+    XrmClass Qclass = XrmPermStringToQuark(class);
+    XrmRepresentation Qtype = XrmPermStringToQuark(type);
+
+    if (XrmQGetSearchResource(list, Qname, Qclass, &db_type, &db_value)) {
+       if (db_type == Qtype) {
+           if (Qtype == _XtQString)
+               *(String*)value->addr = db_value.addr;
+           else
+               (void) memmove(value->addr, db_value.addr, value->size );
+           return True;
+       } else {
+           WidgetRec widget; /* hack, hack */
+           bzero( &widget, sizeof(widget) );
+           widget.core.self = &widget;
+           widget.core.widget_class = coreWidgetClass;
+           widget.core.screen = (Screen*)DefaultScreenOfDisplay(dpy);
+           XtInitializeWidgetClass(coreWidgetClass);
+           if (_XtConvert(&widget,db_type,&db_value,Qtype,value,NULL)) {
+               return True;
+           }
+       }
+    }
+    return False;
+}
+
+XrmDatabase _XtPreparseCommandLine(
+    XrmOptionDescRec *urlist,
+    Cardinal num_urs,
+    int argc,
+    String *argv,
+    /* return */
+    String *applName,
+    String *displayName,
+    String *language)
+{
+    XrmDatabase db = NULL;
+    XrmOptionDescRec *options;
+    Cardinal num_options;
+    XrmName name_list[3];
+    XrmName class_list[3];
+    XrmRepresentation type;
+    XrmValue val;
+    String *targv;
+    int targc = argc;
+
+    targv = (String *) __XtMalloc(sizeof(char *) * argc);
+    (void) memmove(targv, argv, sizeof(char *) * argc);
+    _MergeOptionTables(opTable, XtNumber(opTable), urlist, num_urs,
+                      &options, &num_options);
+    name_list[0] = class_list[0] = XrmPermStringToQuark(".");
+    name_list[2] = class_list[2] = NULLQUARK;
+    XrmParseCommand(&db, options, num_options, ".", &targc, targv);
+    if (applName) {
+       name_list[1] = XrmPermStringToQuark("name");
+       if (XrmQGetResource(db, name_list, name_list, &type, &val) &&
+           type == _XtQString)
+           *applName = val.addr;
+    }
+    if (displayName) {
+       name_list[1] = XrmPermStringToQuark("display");
+       if (XrmQGetResource(db, name_list, name_list, &type, &val) &&
+           type == _XtQString)
+           *displayName = val.addr;
+    }
+    if (language) {
+       name_list[1] = XrmPermStringToQuark("xnlLanguage");
+       class_list[1] = XrmPermStringToQuark("XnlLanguage");
+       if (XrmQGetResource(db, name_list, class_list, &type, &val) &&
+           type == _XtQString)
+           *language = val.addr;
+    }
+
+    XtFree((char *)targv);
+    XtFree((char *)options);
+    return db;
+}
+
+
+static void GetLanguage(
+    Display *dpy,
+    XtPerDisplay pd)
+{
+    XrmRepresentation type;
+    XrmValue value;
+    XrmName name_list[3];
+    XrmName class_list[3];
+
+    LOCK_PROCESS;
+    if (! pd->language) {
+       name_list[0] = pd->name;
+       name_list[1] = XrmPermStringToQuark("xnlLanguage");
+       class_list[0] = pd->class;
+       class_list[1] = XrmPermStringToQuark("XnlLanguage");
+       name_list[2] = class_list[2] = NULLQUARK;
+       if (!pd->server_db)
+           CombineUserDefaults(dpy, &pd->server_db);
+       if (pd->server_db &&
+           XrmQGetResource(pd->server_db,name_list,class_list, &type, &value)
+           && type == _XtQString)
+           pd->language = (char *) value.addr;
+    }
+
+    if (pd->appContext->langProcRec.proc) {
+       if (! pd->language) pd->language = "";
+       pd->language = (*pd->appContext->langProcRec.proc)
+           (dpy, pd->language, pd->appContext->langProcRec.closure);
+    }
+    else if (! pd->language || pd->language[0] == '\0') /* R4 compatibility */
+       pd->language = getenv("LANG");
+
+    if (pd->language) pd->language = XtNewString(pd->language);
+    UNLOCK_PROCESS;
+}
+
+static void ProcessInternalConnection (
+    XtPointer client_data,
+    int* fd,
+    XtInputId* id)
+{
+    XProcessInternalConnection ((Display *) client_data, *fd);
+}
+
+static void ConnectionWatch (
+    Display* dpy,
+    XPointer client_data,
+    int fd,
+    Bool opening,
+    XPointer* watch_data)
+{
+    XtInputId* iptr;
+    XtAppContext app = XtDisplayToApplicationContext(dpy);
+
+    if (opening) {
+       iptr = (XtInputId *) __XtMalloc(sizeof(XtInputId));
+       *iptr = XtAppAddInput(app, fd, (XtPointer) XtInputReadMask,
+                             ProcessInternalConnection, client_data);
+       *watch_data = (XPointer) iptr;
+    } else {
+       iptr = (XtInputId *) *watch_data;
+       XtRemoveInput(*iptr);
+        (void) XtFree(*watch_data);
+    }
+}
+
+void _XtDisplayInitialize(
+       Display *dpy,
+        XtPerDisplay pd,
+       _Xconst char* name,
+       XrmOptionDescRec *urlist,
+       Cardinal num_urs,
+       int *argc,
+       char **argv)
+{
+       Boolean tmp_bool;
+       XrmValue value;
+       XrmOptionDescRec *options;
+       Cardinal num_options;
+       XrmDatabase db;
+       XrmName name_list[2];
+       XrmClass class_list[2];
+       XrmHashTable* search_list;
+       int search_list_size = SEARCH_LIST_SIZE;
+
+       GetLanguage(dpy, pd);
+
+       /* Parse the command line and remove Xt arguments from argv */
+       _MergeOptionTables( opTable, XtNumber(opTable), urlist, num_urs,
+                           &options, &num_options );
+       XrmParseCommand(&pd->cmd_db, options, num_options, name, argc, argv);
+
+       db = XtScreenDatabase(DefaultScreenOfDisplay(dpy));
+
+       if (!(search_list = (XrmHashTable*)
+                      ALLOCATE_LOCAL( SEARCH_LIST_SIZE*sizeof(XrmHashTable))))
+           _XtAllocError(NULL);
+       name_list[0] = pd->name;
+       class_list[0] = pd->class;
+       name_list[1] = NULLQUARK;
+       class_list[1] = NULLQUARK;
+
+       while (!XrmQGetSearchList(db, name_list, class_list,
+                                 search_list, search_list_size)) {
+           XrmHashTable* old = search_list;
+           Cardinal size = (search_list_size*=2)*sizeof(XrmHashTable);
+           if (!(search_list = (XrmHashTable*)ALLOCATE_LOCAL(size)))
+               _XtAllocError(NULL);
+           (void) memmove((char*)search_list, (char*)old, (size>>1) );
+           DEALLOCATE_LOCAL(old);
+       }
+
+       value.size = sizeof(tmp_bool);
+       value.addr = (XtPointer)&tmp_bool;
+       if (_GetResource(dpy, search_list, "synchronous", "Synchronous",
+                        XtRBoolean, &value)) {
+           int i;
+           Display **dpyP = pd->appContext->list;
+           pd->appContext->sync = tmp_bool;
+           for (i = pd->appContext->count; i; dpyP++, i--) {
+               (void) XSynchronize(*dpyP, (Bool)tmp_bool);
+           }
+       } else {
+           (void) XSynchronize(dpy, (Bool)pd->appContext->sync);
+       }
+
+       if (_GetResource(dpy, search_list, "reverseVideo", "ReverseVideo",
+                        XtRBoolean, &value)
+               && tmp_bool) {
+           pd->rv = True;
+       }
+
+       value.size = sizeof(pd->multi_click_time);
+       value.addr = (XtPointer)&pd->multi_click_time;
+       if (!_GetResource(dpy, search_list,
+                         "multiClickTime", "MultiClickTime",
+                         XtRInt, &value)) {
+           pd->multi_click_time = 200;
+       }
+
+       value.size = sizeof(pd->appContext->selectionTimeout);
+       value.addr = (XtPointer)&pd->appContext->selectionTimeout;
+       (void)_GetResource(dpy, search_list,
+                          "selectionTimeout", "SelectionTimeout",
+                          XtRInt, &value);
+
+#ifndef NO_IDENTIFY_WINDOWS
+       value.size = sizeof(pd->appContext->identify_windows);
+       value.addr = (XtPointer)&pd->appContext->identify_windows;
+       (void)_GetResource(dpy, search_list,
+                          "xtIdentifyWindows", "XtDebug",
+                          XtRBoolean, &value);
+#endif
+
+       XAddConnectionWatch(dpy, ConnectionWatch, (XPointer) dpy);
+
+       XtFree( (XtPointer)options );
+       DEALLOCATE_LOCAL( search_list );
+}
+
+/*     Function Name: XtAppSetFallbackResources
+ *     Description: Sets the fallback resource list that will be loaded
+ *                   at display initialization time.
+ *     Arguments: app_context - the app context.
+ *                 specification_list - the resource specification list.
+ *     Returns: none.
+ */
+
+void
+XtAppSetFallbackResources(
+    XtAppContext app_context,
+    String *specification_list)
+{
+    LOCK_APP(app_context);
+    app_context->fallback_resources = specification_list;
+    UNLOCK_APP(app_context);
+}
+
+
+Widget XtOpenApplication(XtAppContext *app_context_return,
+                        _Xconst char *application_class,
+                        XrmOptionDescRec *options, Cardinal num_options,
+                        int *argc_in_out, String *argv_in_out,
+                        String *fallback_resources, WidgetClass widget_class,
+                        ArgList args_in, Cardinal num_args_in)
+{
+    XtAppContext app_con;
+    Display * dpy;
+    register int saved_argc = *argc_in_out;
+    Widget root;
+    Arg args[3], *merged_args;
+    Cardinal num = 0;
+
+    XtToolkitInitialize(); /* cannot be moved into _XtAppInit */
+
+    dpy = _XtAppInit(&app_con, (String)application_class, options, num_options,
+                    argc_in_out, &argv_in_out, fallback_resources);
+
+    LOCK_APP(app_con);
+    XtSetArg(args[num], XtNscreen, DefaultScreenOfDisplay(dpy)); num++;
+    XtSetArg(args[num], XtNargc, saved_argc);                   num++;
+    XtSetArg(args[num], XtNargv, argv_in_out);                  num++;
+
+    merged_args = XtMergeArgLists(args_in, num_args_in, args, num);
+    num += num_args_in;
+
+    root = XtAppCreateShell(NULL, application_class, widget_class, dpy,
+                           merged_args, num);
+
+    if (app_context_return)
+       *app_context_return = app_con;
+
+    XtFree((XtPointer)merged_args);
+    XtFree((XtPointer)argv_in_out);
+    UNLOCK_APP(app_con);
+    return root;
+}
+
+
+Widget
+XtAppInitialize(
+    XtAppContext * app_context_return,
+    _Xconst char* application_class,
+    XrmOptionDescRec *options,
+    Cardinal num_options,
+    int *argc_in_out,
+    String *argv_in_out,
+    String *fallback_resources,
+    ArgList args_in,
+    Cardinal num_args_in)
+{
+    return XtOpenApplication(app_context_return, application_class,
+                            options, num_options,
+                            argc_in_out, argv_in_out, fallback_resources,
+                            applicationShellWidgetClass,
+                            args_in, num_args_in);
+}
+
+
+/*ARGSUSED*/
+Widget
+XtInitialize(
+    _Xconst char* name,
+    _Xconst char* classname,
+    XrmOptionDescRec *options,
+    Cardinal num_options,
+    int *argc,
+    String *argv)
+{
+    Widget root;
+    XtAppContext app_con;
+    register ProcessContext process = _XtGetProcessContext();
+
+    root = XtAppInitialize(&app_con, classname, options, num_options,
+                          argc, argv, NULL, NULL, (Cardinal) 0);
+
+    LOCK_PROCESS;
+    process->defaultAppContext = app_con;
+    UNLOCK_PROCESS;
+    return root;
+}
diff --git a/src/Intrinsic.c b/src/Intrinsic.c
new file mode 100644 (file)
index 0000000..3df0358
--- /dev/null
@@ -0,0 +1,1608 @@
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#define INTRINSIC_C
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "VarargsI.h"        /* for geoTattler */
+#ifndef NO_IDENTIFY_WINDOWS
+#include <X11/Xatom.h>
+#endif
+#ifndef VMS
+#include <sys/stat.h>
+#endif /* VMS */
+
+#include <stdlib.h>
+
+String XtCXtToolkitError = "XtToolkitError";
+
+Boolean XtIsSubclass(
+    Widget    widget,
+    WidgetClass widgetClass)
+{
+    register WidgetClass w;
+    Boolean retval = FALSE;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    for (w = widget->core.widget_class; w != NULL; w = w->core_class.superclass)
+       if (w == widgetClass) {
+           retval = TRUE;
+           break;
+       }
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+    return retval;
+} /* XtIsSubclass */
+
+
+Boolean _XtCheckSubclassFlag(
+    Widget object,
+    _XtXtEnum flag)
+{
+    Boolean retval;
+
+    LOCK_PROCESS;
+    if (object->core.widget_class->core_class.class_inited & flag)
+       retval = TRUE;
+    else
+       retval = FALSE;
+    UNLOCK_PROCESS;
+    return retval;
+} /*_XtVerifySubclass */
+
+
+Boolean _XtIsSubclassOf(
+    Widget object,
+    WidgetClass widgetClass,
+    WidgetClass superClass,
+    _XtXtEnum flag)
+{
+    LOCK_PROCESS;
+    if (!(object->core.widget_class->core_class.class_inited & flag)) {
+       UNLOCK_PROCESS;
+       return False;
+    } else {
+       register WidgetClass c = object->core.widget_class;
+       while (c != superClass) {
+           if (c == widgetClass) {
+               UNLOCK_PROCESS;
+               return True;
+           }
+           c = c->core_class.superclass;
+       }
+       UNLOCK_PROCESS;
+       return False;
+    }
+} /*_XtIsSubclassOf */
+
+
+XtPointer XtGetClassExtension(
+    WidgetClass        object_class,
+    Cardinal   byte_offset,
+    XrmQuark   type,
+    long       version,
+    Cardinal   record_size)
+{
+    ObjectClassExtension ext;
+    LOCK_PROCESS;
+
+    ext = *(ObjectClassExtension *)((char *)object_class + byte_offset);
+    while (ext && (ext->record_type != type || ext->version < version
+                  || ext->record_size < record_size)) {
+       ext = (ObjectClassExtension) ext->next_extension;
+    }
+
+    UNLOCK_PROCESS;
+    return (XtPointer) ext;
+}
+
+
+static void ComputeWindowAttributes(
+    Widget              widget,
+    XtValueMask                 *value_mask,
+    XSetWindowAttributes *values)
+{
+    XtExposeProc expose;
+
+    *value_mask = CWEventMask | CWColormap;
+    (*values).event_mask = XtBuildEventMask(widget);
+    (*values).colormap = widget->core.colormap;
+    if (widget->core.background_pixmap != XtUnspecifiedPixmap) {
+       *value_mask |= CWBackPixmap;
+       (*values).background_pixmap = widget->core.background_pixmap;
+    } else {
+       *value_mask |= CWBackPixel;
+       (*values).background_pixel = widget->core.background_pixel;
+    }
+    if (widget->core.border_pixmap != XtUnspecifiedPixmap) {
+       *value_mask |= CWBorderPixmap;
+       (*values).border_pixmap = widget->core.border_pixmap;
+    } else {
+       *value_mask |= CWBorderPixel;
+       (*values).border_pixel = widget->core.border_pixel;
+    }
+    LOCK_PROCESS;
+    expose = widget->core.widget_class->core_class.expose;
+    UNLOCK_PROCESS;
+    if (expose == (XtExposeProc) NULL) {
+       /* Try to avoid redisplay upon resize by making bit_gravity the same
+          as the default win_gravity */
+       *value_mask |= CWBitGravity;
+       (*values).bit_gravity = NorthWestGravity;
+    }
+} /* ComputeWindowAttributes */
+
+static void CallChangeManaged(
+    register Widget            widget)
+{
+    register Cardinal          i;
+    XtWidgetProc               change_managed;
+    register WidgetList                children;
+    int                        managed_children = 0;
+
+    register CompositePtr cpPtr;
+    register CompositePartPtr clPtr;
+
+    if (XtIsComposite (widget)) {
+       cpPtr = (CompositePtr)&((CompositeWidget) widget)->composite;
+        clPtr = (CompositePartPtr)&((CompositeWidgetClass)
+                   widget->core.widget_class)->composite_class;
+    } else return;
+
+    children = cpPtr->children;
+    LOCK_PROCESS;
+    change_managed = clPtr->change_managed;
+    UNLOCK_PROCESS;
+
+    /* CallChangeManaged for all children */
+    for (i = cpPtr->num_children; i != 0; --i) {
+       CallChangeManaged (children[i-1]);
+       if (XtIsManaged(children[i-1])) managed_children++;
+    }
+
+    if (change_managed != NULL && managed_children != 0) {
+       CALLGEOTAT(_XtGeoTrace(widget,"Call \"%s\"[%d,%d]'s changemanaged\n",
+                      XtName(widget),
+                      widget->core.width, widget->core.height));
+       (*change_managed) (widget);
+    }
+} /* CallChangeManaged */
+
+
+static void MapChildren(
+    CompositePart *cwp)
+{
+    Cardinal i;
+    WidgetList children;
+    register Widget child;
+
+    children = cwp->children;
+    for (i = 0; i <  cwp->num_children; i++) {
+       child = children[i];
+       if (XtIsWidget (child)){
+           if (child->core.managed && child->core.mapped_when_managed) {
+               XtMapWidget (children[i]);
+           }
+       }
+    }
+} /* MapChildren */
+
+
+static Boolean ShouldMapAllChildren(
+    CompositePart *cwp)
+{
+    Cardinal i;
+    WidgetList children;
+    register Widget child;
+
+    children = cwp->children;
+    for (i = 0; i < cwp->num_children; i++) {
+       child = children[i];
+       if (XtIsWidget(child)) {
+           if (XtIsRealized(child) && (! (child->core.managed
+                                         && child->core.mapped_when_managed))){
+                   return False;
+           }
+       }
+    }
+
+    return True;
+} /* ShouldMapAllChildren */
+
+
+static void RealizeWidget(
+    Widget                     widget)
+{
+    XtValueMask                        value_mask;
+    XSetWindowAttributes       values;
+    XtRealizeProc              realize;
+    Window                     window;
+    Display*                   display;
+    String                     class_name;
+    Widget                     hookobj;
+
+    if (!XtIsWidget(widget) || XtIsRealized(widget)) return;
+    display = XtDisplay(widget);
+    _XtInstallTranslations(widget);
+
+    ComputeWindowAttributes (widget, &value_mask, &values);
+    LOCK_PROCESS;
+    realize = widget->core.widget_class->core_class.realize;
+    class_name = widget->core.widget_class->core_class.class_name;
+    UNLOCK_PROCESS;
+    if (realize == NULL)
+       XtAppErrorMsg(XtWidgetToApplicationContext(widget),
+                     "invalidProcedure","realizeProc",XtCXtToolkitError,
+                     "No realize class procedure defined",
+                     (String *)NULL, (Cardinal *)NULL);
+    else {
+       CALLGEOTAT(_XtGeoTrace(widget,"Call \"%s\"[%d,%d]'s realize proc\n",
+                      XtName(widget),
+                      widget->core.width, widget->core.height));
+       (*realize) (widget, &value_mask, &values);
+    }
+    window = XtWindow(widget);
+    hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));
+    if (XtHasCallbacks(hookobj,XtNchangeHook) == XtCallbackHasSome) {
+       XtChangeHookDataRec call_data;
+
+       call_data.type = XtHrealizeWidget;
+       call_data.widget = widget;
+       XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.changehook_callbacks,
+               (XtPointer)&call_data);
+    }
+#ifndef NO_IDENTIFY_WINDOWS
+    if (_XtGetPerDisplay(display)->appContext->identify_windows) {
+       int len_nm, len_cl;
+       char *s;
+
+       len_nm = widget->core.name ? strlen(widget->core.name) : 0;
+       len_cl = strlen(class_name);
+       s = __XtMalloc((unsigned) (len_nm + len_cl + 2));
+       s[0] = '\0';
+       if (len_nm)
+           strcpy(s, widget->core.name);
+       strcpy(s + len_nm + 1, class_name);
+       XChangeProperty(display, window,
+                       XInternAtom(display, "_MIT_OBJ_CLASS",
+                                   False),
+                       XA_STRING, 8, PropModeReplace, (unsigned char *) s,
+                       len_nm + len_cl + 2);
+       XtFree(s);
+    }
+#endif
+#ifdef notdef
+    _XtRegisterAsyncHandlers(widget);
+#endif
+    /* (re)register any grabs extant in the translations */
+    _XtRegisterGrabs(widget);
+    /* reregister any grabs added with XtGrab{Button,Key} */
+    _XtRegisterPassiveGrabs(widget);
+    XtRegisterDrawable (display, window, widget);
+    _XtExtensionSelect(widget);
+
+    if (XtIsComposite (widget)) {
+       Cardinal                i;
+       CompositePart *cwp = &(((CompositeWidget)widget)->composite);
+       WidgetList children = cwp->children;
+       /* Realize all children */
+       for (i = cwp->num_children; i != 0; --i) {
+           RealizeWidget (children[i-1]);
+       }
+       /* Map children that are managed and mapped_when_managed */
+
+       if (cwp->num_children != 0) {
+           if (ShouldMapAllChildren(cwp)) {
+               XMapSubwindows (display, window);
+           } else {
+               MapChildren(cwp);
+           }
+       }
+    }
+
+    /* If this is the application's popup shell, map it */
+    if (widget->core.parent == NULL && widget->core.mapped_when_managed) {
+       XtMapWidget (widget);
+    }
+} /* RealizeWidget */
+
+void XtRealizeWidget (
+    Widget             widget)
+{
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    if (XtIsRealized (widget)) {
+       UNLOCK_APP(app);
+       return;
+    }
+    CallChangeManaged(widget);
+    RealizeWidget(widget);
+    UNLOCK_APP(app);
+} /* XtRealizeWidget */
+
+
+static void UnrealizeWidget(
+    Widget             widget)
+{
+    CompositeWidget    cw;
+    Cardinal           i;
+    WidgetList         children;
+
+    if (!XtIsWidget(widget) || !XtIsRealized(widget)) return;
+
+    /* If this is the application's popup shell, unmap it? */
+    /* no, the window is being destroyed */
+
+    /* Recurse on children */
+    if (XtIsComposite (widget)) {
+       cw = (CompositeWidget) widget;
+       children = cw->composite.children;
+       /* Unrealize all children */
+       for (i = cw->composite.num_children; i != 0; --i) {
+           UnrealizeWidget (children[i-1]);
+       }
+       /* Unmap children that are managed and mapped_when_managed? */
+       /* No, it's ok to be managed and unrealized as long as your parent */
+       /* is unrealized. XtUnrealize widget makes sure the "top" widget */
+       /* is unmanaged, we can ignore all descendents */
+    }
+
+    if (XtHasCallbacks(widget, XtNunrealizeCallback) == XtCallbackHasSome)
+       XtCallCallbacks(widget, XtNunrealizeCallback, NULL);
+
+    /* Unregister window */
+    XtUnregisterDrawable(XtDisplay(widget), XtWindow(widget));
+
+    /* Remove Event Handlers */
+    /* remove grabs. Happens automatically when window is destroyed. */
+
+    /* Destroy X Window, done at outer level with one request */
+    widget->core.window = None;
+
+    /* Removing the event handler here saves having to keep track if
+     * the translation table is changed while the widget is unrealized.
+     */
+    _XtRemoveTranslations(widget);
+} /* UnrealizeWidget */
+
+
+void XtUnrealizeWidget (
+    Widget             widget)
+{
+    Window window;
+    Widget hookobj;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    window = XtWindow(widget);
+    if (! XtIsRealized (widget)) {
+       UNLOCK_APP(app);
+       return;
+    }
+    if (widget->core.managed && widget->core.parent != NULL)
+       XtUnmanageChild(widget);
+    UnrealizeWidget(widget);
+    if (window != None)
+       XDestroyWindow(XtDisplay(widget), window);
+    hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+       XtChangeHookDataRec call_data;
+
+       call_data.type = XtHunrealizeWidget;
+       call_data.widget = widget;
+       XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.changehook_callbacks,
+               (XtPointer)&call_data);
+    }
+    UNLOCK_APP(app);
+} /* XtUnrealizeWidget */
+
+
+void XtCreateWindow(
+    Widget              widget,
+    unsigned int        window_class,
+    Visual              *visual,
+    XtValueMask                 value_mask,
+    XSetWindowAttributes *attributes)
+{
+    XtAppContext app = XtWidgetToApplicationContext(widget);
+
+    LOCK_APP(app);
+    if (widget->core.window == None) {
+       if (widget->core.width == 0 || widget->core.height == 0) {
+           Cardinal count = 1;
+           XtAppErrorMsg(app,
+                      "invalidDimension", "xtCreateWindow", XtCXtToolkitError,
+                      "Widget %s has zero width and/or height",
+                      &widget->core.name, &count);
+       }
+       widget->core.window =
+           XCreateWindow (
+               XtDisplay (widget),
+               (widget->core.parent ?
+                   widget->core.parent->core.window :
+                   widget->core.screen->root),
+               (int)widget->core.x, (int)widget->core.y,
+               (unsigned)widget->core.width, (unsigned)widget->core.height,
+               (unsigned)widget->core.border_width, (int) widget->core.depth,
+               window_class, visual, value_mask, attributes);
+    }
+    UNLOCK_APP(app);
+} /* XtCreateWindow */
+
+
+/* ---------------- XtNameToWidget ----------------- */
+
+static Widget NameListToWidget(
+    Widget root,
+    XrmNameList     names,
+    XrmBindingList  bindings,
+    int in_depth, int *out_depth, int *found_depth);
+
+typedef Widget (*NameMatchProc)(XrmNameList,
+    XrmBindingList,
+    WidgetList, Cardinal, int, int *, int *);
+
+static Widget MatchExactChildren(
+    XrmNameList     names,
+    XrmBindingList  bindings,
+    register WidgetList children,
+    register Cardinal num,
+    int in_depth, int *out_depth, int *found_depth)
+{
+    register Cardinal   i;
+    register XrmName    name = *names;
+    Widget w, result = NULL;
+    int d, min = 10000;
+
+    for (i = 0; i < num; i++) {
+       if (name == children[i]->core.xrm_name) {
+           w = NameListToWidget(children[i], &names[1], &bindings[1],
+                   in_depth+1, &d, found_depth);
+           if (w != NULL && d < min) {result = w; min = d;}
+       }
+    }
+    *out_depth = min;
+    return result;
+}
+
+static Widget MatchWildChildren(
+    XrmNameList     names,
+    XrmBindingList  bindings,
+    register WidgetList children,
+    register Cardinal num,
+    int in_depth, int *out_depth, int *found_depth)
+{
+    register Cardinal   i;
+    Widget w, result = NULL;
+    int d, min = 10000;
+
+    for (i = 0; i < num; i++) {
+       w = NameListToWidget(children[i], names, bindings,
+               in_depth+1, &d, found_depth);
+       if (w != NULL && d < min) {result = w; min = d;}
+    }
+    *out_depth = min;
+    return result;
+}
+
+static Widget SearchChildren(
+    Widget root,
+    XrmNameList     names,
+    XrmBindingList  bindings,
+    NameMatchProc matchproc,
+    int in_depth, int *out_depth, int *found_depth)
+{
+    Widget w1 = NULL, w2;
+    int d1, d2;
+
+    if (XtIsComposite(root)) {
+       w1 = (*matchproc)(names, bindings,
+               ((CompositeWidget) root)->composite.children,
+               ((CompositeWidget) root)->composite.num_children,
+               in_depth, &d1, found_depth);
+    } else d1 = 10000;
+    w2 = (*matchproc)(names, bindings, root->core.popup_list,
+           root->core.num_popups, in_depth, &d2, found_depth);
+    *out_depth = (d1 < d2 ? d1 : d2);
+    return (d1 < d2 ? w1 : w2);
+}
+
+static Widget NameListToWidget(
+    register Widget root,
+    XrmNameList     names,
+    XrmBindingList  bindings,
+    int in_depth, int *out_depth, int *found_depth)
+{
+    Widget w1, w2;
+    int d1, d2;
+
+    if (in_depth >= *found_depth) {
+       *out_depth = 10000;
+       return NULL;
+    }
+
+    if (names[0] == NULLQUARK) {
+       *out_depth = *found_depth = in_depth;
+       return root;
+    }
+
+    if (! XtIsWidget(root)) {
+       *out_depth = 10000;
+       return NULL;
+    }
+
+    if (*bindings == XrmBindTightly) {
+       return SearchChildren(root, names, bindings, MatchExactChildren,
+               in_depth, out_depth, found_depth);
+
+    } else {   /* XrmBindLoosely */
+       w1 = SearchChildren(root, names, bindings, MatchExactChildren,
+               in_depth, &d1, found_depth);
+       w2 = SearchChildren(root, names, bindings, MatchWildChildren,
+               in_depth, &d2, found_depth);
+       *out_depth = (d1 < d2 ? d1 : d2);
+       return (d1 < d2 ? w1 : w2);
+    }
+} /* NameListToWidget */
+
+Widget XtNameToWidget(
+    Widget root,
+    _Xconst char* name)
+{
+    XrmName *names;
+    XrmBinding *bindings;
+    int len, depth, found = 10000;
+    Widget result;
+    WIDGET_TO_APPCON(root);
+
+    len = strlen(name);
+    if (len == 0) return NULL;
+
+    LOCK_APP(app);
+    names = (XrmName *) ALLOCATE_LOCAL((unsigned) (len+1) * sizeof(XrmName));
+    bindings = (XrmBinding *)
+       ALLOCATE_LOCAL((unsigned) (len+1) * sizeof(XrmBinding));
+    if (names == NULL || bindings == NULL) _XtAllocError(NULL);
+
+    XrmStringToBindingQuarkList(name, bindings, names);
+    if (names[0] == NULLQUARK) {
+       DEALLOCATE_LOCAL((char *) bindings);
+       DEALLOCATE_LOCAL((char *) names);
+       UNLOCK_APP(app);
+       return NULL;
+    }
+
+    result = NameListToWidget(root, names, bindings, 0, &depth, &found);
+
+    DEALLOCATE_LOCAL((char *) bindings);
+    DEALLOCATE_LOCAL((char *) names);
+    UNLOCK_APP(app);
+    return result;
+} /* XtNameToWidget */
+
+/* Define user versions of intrinsics macros */
+
+#undef XtDisplayOfObject
+Display *XtDisplayOfObject(
+     Widget object)
+{
+    /* Attempts to LockApp() here will generate endless recursive loops */
+    if (XtIsSubclass(object, hookObjectClass))
+       return DisplayOfScreen(((HookObject)object)->hooks.screen);
+    return XtDisplay(XtIsWidget(object) ? object : _XtWindowedAncestor(object));
+}
+
+#undef XtDisplay
+Display *XtDisplay(
+       Widget widget)
+{
+    /* Attempts to LockApp() here will generate endless recursive loops */
+    return DisplayOfScreen(widget->core.screen);
+}
+
+#undef XtScreenOfObject
+Screen *XtScreenOfObject(
+     Widget object)
+{
+    /* Attempts to LockApp() here will generate endless recursive loops */
+    if (XtIsSubclass(object, hookObjectClass))
+       return ((HookObject)object)->hooks.screen;
+    return XtScreen(XtIsWidget(object) ? object : _XtWindowedAncestor(object));
+}
+
+#undef XtScreen
+Screen *XtScreen(
+       Widget widget)
+{
+    /* Attempts to LockApp() here will generate endless recursive loops */
+    return widget->core.screen;
+}
+
+#undef XtWindowOfObject
+Window XtWindowOfObject(
+     Widget object)
+{
+    return XtWindow(XtIsWidget(object) ? object : _XtWindowedAncestor(object));
+}
+
+
+#undef XtWindow
+Window XtWindow(
+       Widget widget)
+{
+    return widget->core.window;
+}
+
+#undef XtSuperclass
+WidgetClass XtSuperclass(
+    Widget widget)
+{
+    WidgetClass retval;
+
+    LOCK_PROCESS;
+    retval = XtClass(widget)->core_class.superclass;
+    UNLOCK_PROCESS;
+    return retval;
+}
+
+#undef XtClass
+WidgetClass XtClass(
+    Widget widget)
+{
+    WidgetClass retval;
+
+    LOCK_PROCESS;
+    retval = widget->core.widget_class;
+    UNLOCK_PROCESS;
+    return retval;
+}
+
+#undef XtIsManaged
+Boolean XtIsManaged(
+       Widget object)
+{
+    Boolean retval;
+    WIDGET_TO_APPCON(object);
+
+    LOCK_APP(app);
+    if (XtIsRectObj(object))
+       retval = object->core.managed;
+    else
+       retval = False;
+    UNLOCK_APP(app);
+    return retval;
+}
+
+#undef XtIsRealized
+Boolean XtIsRealized (
+    Widget   object)
+{
+    Boolean retval;
+    WIDGET_TO_APPCON(object);
+
+    LOCK_APP(app);
+    retval = XtWindowOfObject(object) != None;
+    UNLOCK_APP(app);
+    return retval;
+} /* XtIsRealized */
+
+#undef XtIsSensitive
+Boolean XtIsSensitive(
+       Widget  object)
+{
+    Boolean retval;
+    WIDGET_TO_APPCON(object);
+
+    LOCK_APP(app);
+    if (XtIsRectObj(object))
+       retval = object->core.sensitive && object->core.ancestor_sensitive;
+    else
+       retval = False;
+    UNLOCK_APP(app);
+    return retval;
+}
+
+/*
+ * Internal routine; must be called only after XtIsWidget returns false
+ */
+Widget _XtWindowedAncestor(
+    register Widget object)
+{
+    Widget obj = object;
+    for (object = XtParent(object); object && !XtIsWidget(object);)
+       object = XtParent(object);
+
+    if (object == NULL) {
+       String params = XtName(obj);
+       Cardinal num_params = 1;
+       XtErrorMsg("noWidgetAncestor", "windowedAncestor", XtCXtToolkitError,
+                  "Object \"%s\" does not have windowed ancestor",
+                  &params, &num_params);
+    }
+
+    return object;
+}
+
+#undef XtParent
+Widget XtParent(
+    Widget widget)
+{
+    /* Attempts to LockApp() here will generate endless recursive loops */
+    return widget->core.parent;
+}
+
+#undef XtName
+String XtName(
+     Widget object)
+{
+    /* Attempts to LockApp() here will generate endless recursive loops */
+    return XrmQuarkToString(object->core.xrm_name);
+}
+
+
+Boolean XtIsObject(
+    Widget object)
+{
+    WidgetClass wc;
+    String class_name;
+
+    /* perform basic sanity checks */
+    if (object->core.self != object || object->core.xrm_name == NULLQUARK)
+       return False;
+
+    LOCK_PROCESS;
+    wc = object->core.widget_class;
+    if (wc->core_class.class_name == NULL ||
+       wc->core_class.xrm_class == NULLQUARK ||
+       (class_name = XrmClassToString(wc->core_class.xrm_class)) == NULL ||
+       strcmp(wc->core_class.class_name, class_name) != 0) {
+           UNLOCK_PROCESS;
+           return False;
+       }
+    UNLOCK_PROCESS;
+
+    if (XtIsWidget(object)) {
+       if (object->core.name == NULL ||
+           (class_name = XrmNameToString(object->core.xrm_name)) == NULL ||
+           strcmp(object->core.name, class_name) != 0)
+           return False;
+    }
+    return True;
+}
+
+#if defined(WIN32)
+static int access_file (
+    char* path,
+    char* pathbuf,
+    int len_pathbuf,
+    char** pathret)
+{
+    if (access (path, F_OK) == 0) {
+       if (strlen (path) < len_pathbuf)
+           *pathret = pathbuf;
+       else
+           *pathret = XtMalloc (strlen (path));
+       if (*pathret) {
+           strcpy (*pathret, path);
+           return 1;
+       }
+    }
+    return 0;
+}
+
+static int AccessFile (
+    char* path,
+    char* pathbuf,
+    int len_pathbuf,
+    char** pathret)
+{
+    unsigned long drives;
+    int i, len;
+    char* drive;
+    char buf[MAX_PATH];
+    char* bufp;
+
+    /* just try the "raw" name first and see if it works */
+    if (access_file (path, pathbuf, len_pathbuf, pathret))
+       return 1;
+
+#if defined(WIN32) && defined(__MINGW32__)
+    /* don't try others */
+    return 0;
+#endif
+
+    /* try the places set in the environment */
+    drive = getenv ("_XBASEDRIVE");
+#ifdef __UNIXOS2__
+    if (!drive)
+       drive = getenv ("X11ROOT");
+#endif
+    if (!drive)
+       drive = "C:";
+    len = strlen (drive) + strlen (path);
+    bufp = XtStackAlloc (len + 1, buf);
+    strcpy (bufp, drive);
+    strcat (bufp, path);
+    if (access_file (bufp, pathbuf, len_pathbuf, pathret)) {
+       XtStackFree (bufp, buf);
+       return 1;
+    }
+
+#ifndef __UNIXOS2__
+    /* one last place to look */
+    drive = getenv ("HOMEDRIVE");
+    if (drive) {
+       len = strlen (drive) + strlen (path);
+       bufp = XtStackAlloc (len + 1, buf);
+       strcpy (bufp, drive);
+       strcat (bufp, path);
+       if (access_file (bufp, pathbuf, len_pathbuf, pathret)) {
+           XtStackFree (bufp, buf);
+           return 1;
+       }
+    }
+
+    /* does OS/2 (with or with gcc-emx) have getdrives()? */
+    /* tried everywhere else, go fishing */
+    drives = _getdrives ();
+#define C_DRIVE ('C' - 'A')
+#define Z_DRIVE ('Z' - 'A')
+    for (i = C_DRIVE; i <= Z_DRIVE; i++) { /* don't check on A: or B: */
+       if ((1 << i) & drives) {
+           len = 2 + strlen (path);
+           bufp = XtStackAlloc (len + 1, buf);
+           *bufp = 'A' + i;
+           *(bufp + 1) = ':';
+           *(bufp + 2) = '\0';
+           strcat (bufp, path);
+           if (access_file (bufp, pathbuf, len_pathbuf, pathret)) {
+               XtStackFree (bufp, buf);
+               return 1;
+           }
+       }
+    }
+#endif
+    return 0;
+}
+#endif
+
+static Boolean TestFile(
+    String path)
+{
+#ifndef VMS
+    int ret = 0;
+    struct stat status;
+#if defined(WIN32)
+    char buf[MAX_PATH];
+    char* bufp;
+    int len;
+    UINT olderror = SetErrorMode (SEM_FAILCRITICALERRORS);
+
+    if (AccessFile (path, buf, MAX_PATH, &bufp))
+       path = bufp;
+
+    (void) SetErrorMode (olderror);
+#endif
+    ret = (access(path, R_OK) == 0 &&          /* exists and is readable */
+           stat(path, &status) == 0 &&         /* get the status */
+#ifndef X_NOT_POSIX
+           S_ISDIR(status.st_mode) == 0);      /* not a directory */
+#else
+           (status.st_mode & S_IFMT) != S_IFDIR);      /* not a directory */
+#endif /* X_NOT_POSIX else */
+    return ret;
+#else /* VMS */
+    return TRUE;       /* Who knows what to do here? */
+#endif /* VMS */
+}
+
+/* return of TRUE = resolved string fit, FALSE = didn't fit.  Not
+   null-terminated and not collapsed if it didn't fit */
+
+static Boolean Resolve(
+    register _Xconst char *source,     /* The source string */
+    register int len,          /* The length in bytes of *source */
+    Substitution sub,  /* Array of string values to substitute */
+    Cardinal num,      /* Number of substitution entries */
+    char *buf,         /* Where to put the resolved string; */
+    char collapse)     /* Character to collapse */
+{
+    register int bytesLeft = PATH_MAX;
+    register char* bp = buf;
+#ifndef DONT_COLLAPSE
+    Boolean atBeginning = TRUE;
+    Boolean prevIsCollapse = FALSE;
+
+#define PUT(ch) \
+    { \
+       if (--bytesLeft == 0) return FALSE; \
+        if (prevIsCollapse) \
+           if ((*bp = ch) != collapse) { \
+               prevIsCollapse = FALSE; \
+               bp++; \
+           } \
+           else bytesLeft++; \
+        else if ((*bp++ = ch) == collapse && !atBeginning) \
+           prevIsCollapse = TRUE; \
+    }
+#else /* DONT_COLLAPSE */
+
+#define PUT(ch) \
+    { \
+       if (--bytesLeft == 0) return FALSE; \
+       *bp++ = ch; \
+    }
+#endif /* DONT_COLLAPSE */
+#define escape '%'
+
+    while (len--) {
+#ifndef DONT_COLLAPSE
+       if (*source == collapse) {
+           PUT(*source);
+           source++;
+           continue;
+       }
+       else
+#endif /* DONT_COLLAPSE */
+           if (*source != escape) {
+               PUT(*source);
+       }
+       else {
+           source++;
+           if (len-- == 0) {
+               PUT(escape);
+               break;
+           }
+
+           if (*source == ':' || *source == escape)
+               PUT(*source)
+           else {
+               /* Match the character against the match array */
+               register Cardinal j;
+
+               for (j = 0; j < num && sub[j].match != *source; j++) {}
+
+               /* Substitute the substitution string */
+
+               if (j >= num) PUT(*source)
+               else if (sub[j].substitution != NULL) {
+                   char *sp = sub[j].substitution;
+                   while (*sp) {
+                       PUT(*sp);
+                       sp++;
+                   }
+               }
+           }
+       }
+       source++;
+#ifndef DONT_COLLAPSE
+       atBeginning = FALSE;
+#endif /* DONT_COLLAPSE */
+    }
+    PUT('\0');
+
+    return TRUE;
+#undef PUT
+#undef escape
+}
+
+
+String XtFindFile(
+    _Xconst char* path,
+    Substitution substitutions,
+    Cardinal num_substitutions,
+    XtFilePredicate predicate)
+{
+    char *buf, *buf1, *buf2, *colon;
+    int len;
+    Boolean firstTime = TRUE;
+
+    buf = buf1 = __XtMalloc((unsigned)PATH_MAX);
+    buf2 = __XtMalloc((unsigned)PATH_MAX);
+
+    if (predicate == NULL) predicate = TestFile;
+
+    while (1) {
+       colon = (String)path;
+       /* skip leading colons */
+       while (*colon) {
+           if (*colon != ':') break;
+           colon++;
+           path++;
+       }
+       /* now look for an un-escaped colon */
+       for ( ; *colon ; colon++) {
+           if (*colon == '%' && *(path+1)) {
+               colon++;        /* bump it an extra time to skip %. */
+               continue;
+           }
+           if (*colon == ':')
+#ifdef __UNIXOS2__
+             if (colon > (path+1))
+#endif
+               break;
+       }
+       len = colon - path;
+       if (Resolve(path, len, substitutions, num_substitutions,
+                   buf, '/')) {
+           if (firstTime || strcmp(buf1,buf2) != 0) {
+#ifdef __UNIXOS2__
+               {
+                       char *bufx = (char*)__XOS2RedirRoot(buf);
+                       strcpy(buf,bufx);
+               }
+#endif
+#ifdef XNL_DEBUG
+               printf("Testing file %s\n", buf);
+#endif /* XNL_DEBUG */
+               /* Check out the file */
+               if ((*predicate) (buf)) {
+                   /* We've found it, return it */
+#ifdef XNL_DEBUG
+                   printf("File found.\n");
+#endif /* XNL_DEBUG */
+                   if (buf == buf1) XtFree(buf2);
+                   else XtFree(buf1);
+                   return buf;
+               }
+               if (buf == buf1)
+                   buf = buf2;
+               else
+                   buf = buf1;
+               firstTime = FALSE;
+           }
+       }
+
+       /* Nope...any more paths? */
+
+       if (*colon == '\0') break;
+       path = colon+1;
+    }
+
+    /* No file found */
+
+    XtFree(buf1);
+    XtFree(buf2);
+    return NULL;
+}
+
+
+/* The implementation of this routine is operating system dependent */
+/* Should match the code in Xlib _XlcMapOSLocaleName */
+
+static char *ExtractLocaleName(
+    String     lang)
+{
+
+#if defined(hpux) || defined(CSRG_BASED) || defined(sun) || defined(SVR4) || defined(sgi) || defined(__osf__) || defined(AIXV3) || defined(ultrix) || defined(WIN32) || defined(__UNIXOS2__) || defined (linux)
+# ifdef hpux
+/*
+ * We need to discriminated between HPUX 9 and HPUX 10. The equivalent
+ * code in Xlib in SetLocale.c does include locale.h via X11/Xlocale.h.
+ */
+#  include <locale.h>
+#  ifndef _LastCategory
+   /* HPUX 9 and earlier */
+#   define SKIPCOUNT 2
+#   define STARTCHAR ':'
+#   define ENDCHAR ';'
+#  else
+    /* HPUX 10 */
+#   define ENDCHAR ' '
+#  endif
+# else
+#  ifdef ultrix
+#   define SKIPCOUNT 2
+#   define STARTCHAR '\001'
+#   define ENDCHAR '\001'
+#  else
+#   if defined(WIN32) || defined(__UNIXOS2__)
+#    define SKIPCOUNT 1
+#    define STARTCHAR '='
+#    define ENDCHAR ';'
+#    define WHITEFILL
+#   else
+#    if defined(__osf__) || (defined(AIXV3) && !defined(AIXV4))
+#     define STARTCHAR ' '
+#     define ENDCHAR ' '
+#    else
+#     if defined(linux)
+#      define STARTSTR "LC_CTYPE="
+#      define ENDCHAR ';'
+#     else
+#      if !defined(sun) || defined(SVR4)
+#       define STARTCHAR '/'
+#       define ENDCHAR '/'
+#      endif
+#     endif
+#    endif
+#   endif
+#  endif
+# endif
+
+    char           *start;
+    char           *end;
+    int             len;
+# ifdef SKIPCOUNT
+    int                    n;
+# endif
+    static char*    buf = NULL;
+
+    start = lang;
+# ifdef SKIPCOUNT
+    for (n = SKIPCOUNT;
+        --n >= 0 && start && (start = strchr (start, STARTCHAR));
+        start++)
+       ;
+    if (!start)
+       start = lang;
+# endif
+# ifdef STARTCHAR
+    if (start && (start = strchr (start, STARTCHAR)))
+# elif  defined (STARTSTR)
+    if (start && (start = strstr (start,STARTSTR)))
+# endif
+    {
+# ifdef STARTCHAR
+       start++;
+# elif defined (STARTSTR)
+       start += strlen(STARTSTR);
+# endif
+
+       if ((end = strchr (start, ENDCHAR))) {
+           len = end - start;
+           if (buf != NULL) XtFree (buf);
+           buf = XtMalloc (len + 1);
+           if (buf == NULL) return NULL;
+           strncpy(buf, start, len);
+           *(buf + len) = '\0';
+# ifdef WHITEFILL
+           for (start = buf; start = strchr(start, ' '); )
+               *start++ = '-';
+# endif
+           return buf;
+       } else  /* if no ENDCHAR is found we are at the end of the line */
+           return start;
+    }
+# ifdef WHITEFILL
+    if (strchr(lang, ' ')) {
+       if (buf != NULL) XtFree (buf);
+       else buf = XtMalloc (strlen (lang) + 1);
+       if (buf == NULL) return NULL;
+       strcpy(buf, lang);
+       for (start = buf; start = strchr(start, ' '); )
+           *start++ = '-';
+       return buf;
+    }
+# endif
+# undef STARTCHAR
+# undef ENDCHAR
+# undef WHITEFILL
+#endif
+
+    return lang;
+}
+
+static void FillInLangSubs(
+    Substitution subs,
+    XtPerDisplay pd)
+{
+    int len;
+    char *string, *p1, *p2, *p3;
+    char **rest;
+    char *ch;
+
+    if (pd->language == NULL ||
+       (pd->language != NULL && pd->language[0] == '\0')) {
+       subs[0].substitution = subs[1].substitution =
+               subs[2].substitution = subs[3].substitution = NULL;
+       return;
+    }
+
+    string = ExtractLocaleName(pd->language);
+
+    if (string == NULL ||
+       (string != NULL && string[0] == '\0')) {
+       subs[0].substitution = subs[1].substitution =
+               subs[2].substitution = subs[3].substitution = NULL;
+       return;
+    }
+
+    len = strlen(string) + 1;
+    subs[0].substitution = string;
+    p1 = subs[1].substitution = __XtMalloc((Cardinal) 3*len);
+    p2 = subs[2].substitution = subs[1].substitution + len;
+    p3 = subs[3].substitution = subs[2].substitution + len;
+
+    /* Everything up to the first "_" goes into p1.  From "_" to "." in
+       p2.  The rest in p3.  If no delimiters, all goes into p1.  We
+       assume p1, p2, and p3 are large enough. */
+
+    *p1 = *p2 = *p3 = '\0';
+
+    ch = strchr(string, '_');
+    if (ch != NULL) {
+       len = ch - string;
+       (void) strncpy(p1, string, len);
+       p1[len] = '\0';
+       string = ch + 1;
+       rest = &p2;
+    } else rest = &p1;
+
+    /* Rest points to where we put the first part */
+
+    ch = strchr(string, '.');
+    if (ch != NULL) {
+       len = ch - string;
+       strncpy(*rest, string, len);
+       (*rest)[len] = '\0';
+       (void) strcpy(p3, ch+1);
+    } else (void) strcpy(*rest, string);
+}
+
+/*
+ * default path used if environment variable XFILESEARCHPATH
+ * is not defined.  Also substitued for %D.
+ * The exact value should be documented in the implementation
+ * notes for any Xt implementation.
+ */
+static const char *implementation_default_path(void)
+{
+#if defined(WIN32)
+    static char xfilesearchpath[] = "";
+
+    return xfilesearchpath;
+#elif defined(__UNIXOS2__)
+    /* if you know how to pass % thru the compiler let me know */
+    static char xfilesearchpath[] = XFILESEARCHPATHDEFAULT;
+    static Bool fixed;
+    char *ch;
+
+    if (!fixed) {
+       for (ch = xfilesearchpath; ch = strchr(ch, ';'); ch++)
+           *ch = '%';
+       fixed = True;
+    }
+    return xfilesearchpath;
+#else
+    return XFILESEARCHPATHDEFAULT;
+#endif
+}
+
+
+static SubstitutionRec defaultSubs[] = {
+    {'N', NULL},
+    {'T', NULL},
+    {'S', NULL},
+    {'C', NULL},
+    {'L', NULL},
+    {'l', NULL},
+    {'t', NULL},
+    {'c', NULL}
+};
+
+
+String XtResolvePathname(
+    Display *dpy,
+    _Xconst char* type,
+    _Xconst char* filename,
+    _Xconst char* suffix,
+    _Xconst char* path,
+    Substitution substitutions,
+    Cardinal num_substitutions,
+    XtFilePredicate predicate)
+{
+    XtPerDisplay pd;
+    static const char *defaultPath = NULL;
+    const char *impl_default = implementation_default_path();
+    int idef_len = strlen(impl_default);
+    char *massagedPath;
+    int bytesAllocd, bytesLeft;
+    char *ch, *result;
+    Substitution merged_substitutions;
+    XrmRepresentation db_type;
+    XrmValue value;
+    XrmName name_list[3];
+    XrmClass class_list[3];
+    Boolean pathMallocd = False;
+
+    LOCK_PROCESS;
+    pd = _XtGetPerDisplay(dpy);
+    if (path == NULL) {
+#ifndef VMS
+       if (defaultPath == NULL) {
+           defaultPath = getenv("XFILESEARCHPATH");
+           if (defaultPath == NULL)
+               defaultPath = impl_default;
+       }
+       path = defaultPath;
+#endif /* VMS */
+    }
+
+    if (path == NULL)
+       path = "";      /* NULL would kill us later */
+
+    if (filename == NULL) {
+       filename = XrmClassToString(pd->class);
+    }
+
+    bytesAllocd = bytesLeft = 1000;
+    massagedPath = ALLOCATE_LOCAL(bytesAllocd);
+    if (massagedPath == NULL) _XtAllocError(NULL);
+
+    if (path[0] == ':') {
+       strcpy(massagedPath, "%N%S");
+       ch = &massagedPath[4];
+       bytesLeft -= 4;
+    } else ch = massagedPath;
+
+    /* Insert %N%S between adjacent colons
+     * and default path for %D.
+     * Default path should not have any adjacent colons of its own.
+     */
+
+    while (*path != '\0') {
+       if (bytesLeft < idef_len) {
+           int bytesUsed = bytesAllocd - bytesLeft;
+           char *new;
+           bytesAllocd +=1000;
+           new = __XtMalloc((Cardinal) bytesAllocd);
+           strncpy( new, massagedPath, bytesUsed );
+           ch = new + bytesUsed;
+           if (pathMallocd)
+               XtFree(massagedPath);
+           else
+               DEALLOCATE_LOCAL(massagedPath);
+           pathMallocd = True;
+           massagedPath = new;
+           bytesLeft = bytesAllocd - bytesUsed;
+       }
+       if (*path == '%' && *(path+1) == ':') {
+           *ch++ = '%';
+           *ch++ = ':';
+           path += 2;
+           bytesLeft -= 2;
+           continue;
+       }
+       if (*path == ':' && *(path+1) == ':') {
+           strcpy(ch, ":%N%S:");
+           ch += 6;
+           bytesLeft -= 6;
+           while (*path == ':') path++;
+           continue;
+       }
+       if (*path == '%' && *(path+1) == 'D') {
+           strcpy(ch, impl_default);
+           ch += idef_len;
+           bytesLeft -= idef_len;
+           path += 2;
+           continue;
+       }
+       *ch++ = *path++;
+       bytesLeft--;
+    }
+    *ch = '\0';
+#ifdef XNL_DEBUG
+    printf("Massaged path: %s\n", massagedPath);
+#endif /* XNL_DEBUG */
+
+    if (num_substitutions == 0)
+       merged_substitutions = defaultSubs;
+    else {
+       int i = XtNumber(defaultSubs);
+       Substitution sub, def;
+       merged_substitutions = sub = (Substitution)
+           ALLOCATE_LOCAL((unsigned)(num_substitutions+i)*sizeof(SubstitutionRec));
+       if (sub == NULL) _XtAllocError(NULL);
+       for (def = defaultSubs; i--; sub++, def++) sub->match = def->match;
+       for (i = num_substitutions; i--; ) *sub++ = *substitutions++;
+    }
+    merged_substitutions[0].substitution = (String)filename;
+    merged_substitutions[1].substitution = (String)type;
+    merged_substitutions[2].substitution = (String)suffix;
+    name_list[0] = pd->name;
+    name_list[1] = XrmPermStringToQuark("customization");
+    name_list[2] = NULLQUARK;
+    class_list[0] = pd->class;
+    class_list[1] = XrmPermStringToQuark("Customization");
+    class_list[2] = NULLQUARK;
+    if (XrmQGetResource(XrmGetDatabase(dpy), name_list, class_list,
+                       &db_type, &value) &&
+       db_type == _XtQString)
+       merged_substitutions[3].substitution = (char *)value.addr;
+    else
+       merged_substitutions[3].substitution = NULL;
+    FillInLangSubs(&merged_substitutions[4], pd);
+
+    result = XtFindFile(massagedPath, merged_substitutions,
+                       num_substitutions + XtNumber(defaultSubs),
+                       predicate);
+
+    if (merged_substitutions[5].substitution != NULL)
+       XtFree( (XtPointer)merged_substitutions[5].substitution );
+
+    if (merged_substitutions != defaultSubs)
+       DEALLOCATE_LOCAL(merged_substitutions);
+
+    if (pathMallocd)
+       XtFree(massagedPath);
+    else
+       DEALLOCATE_LOCAL(massagedPath);
+
+    UNLOCK_PROCESS;
+    return result;
+}
+
+
+Boolean XtCallAcceptFocus(
+    Widget widget,
+    Time *time)
+{
+    XtAcceptFocusProc ac;
+    Boolean retval;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    ac = XtClass(widget)->core_class.accept_focus;
+    UNLOCK_PROCESS;
+
+    if (ac != NULL)
+       retval = (*ac) (widget, time);
+    else
+       retval = FALSE;
+    UNLOCK_APP(app);
+    return retval;
+}
+
+#ifdef XT_GEO_TATTLER
+/**************************************************************************
+ GeoTattler:  This is used to debug Geometry management in Xt.
+
+  It uses a pseudo resource XtNgeotattler.
+
+  E.G. if those lines are found in the resource database:
+
+    myapp*draw.XmScale.geoTattler: ON
+    *XmScrollBar.geoTattler:ON
+    *XmRowColumn.exit_button.geoTattler:ON
+
+   then:
+
+    all the XmScale children of the widget named draw,
+    all the XmScrollBars,
+    the widget named exit_button in any XmRowColumn
+
+   will return True to the function IsTattled(), and will generate
+   outlined trace to stdout.
+
+*************************************************************************/
+
+#define XtNgeoTattler "geoTattler"
+#define XtCGeoTattler "GeoTattler"
+
+typedef struct { Boolean   geo_tattler ;} GeoDataRec ;
+
+static XtResource geo_resources[] = {
+    { XtNgeoTattler, XtCGeoTattler, XtRBoolean, sizeof(Boolean),
+      XtOffsetOf(GeoDataRec, geo_tattler),
+      XtRImmediate, (XtPointer) False }
+};
+
+/************************************************************************
+  This function uses XtGetSubresources to find out if a widget
+  needs to be geo-spied by the caller. */
+static Boolean IsTattled (Widget widget)
+{
+    GeoDataRec geo_data ;
+
+    XtGetSubresources(widget, (XtPointer)&geo_data,
+                      (String)NULL, (String)NULL,
+                     geo_resources, XtNumber(geo_resources),
+                     NULL, 0);
+
+    return geo_data.geo_tattler;
+
+}  /* IsTattled */
+
+static int n_tab = 0 ;  /* not MT for now */
+
+void
+_XtGeoTab (int direction)  /* +1 or -1 */
+{
+    n_tab += direction ;
+}
+
+
+void
+_XtGeoTrace (Widget widget, ...)
+{
+    va_list args;
+    char *fmt;
+    int i ;
+    if (IsTattled(widget)) {
+       va_start(args, widget);
+       fmt = va_arg(args, char *);
+       for (i=0; i<n_tab; i++) printf("     ");
+       (void) vprintf(fmt, args);
+       va_end(args);
+    }
+}
+
+#endif /* XT_GEO_TATTLER */
+
diff --git a/src/Keyboard.c b/src/Keyboard.c
new file mode 100644 (file)
index 0000000..c8ba863
--- /dev/null
@@ -0,0 +1,866 @@
+/*
+
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+*/
+/********************************************************
+
+Copyright 1988 by Hewlett-Packard Company
+Copyright 1987, 1988, 1989 by Digital Equipment Corporation, Maynard, Massachusetts
+
+Permission to use, copy, modify, and distribute this software
+and its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that copyright notice and this permission
+notice appear in supporting documentation, and that the names of
+Hewlett-Packard or Digital not be used in advertising or
+publicity pertaining to distribution of the software without specific,
+written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+********************************************************/
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+
+#include "PassivGraI.h"
+#include "EventI.h"
+
+#define _GetWindowedAncestor(w) (XtIsWidget(w) ? w : _XtWindowedAncestor(w))
+
+/* InActiveSubtree cache of the current focus source and its ancestors */
+static Widget  *pathTrace = NULL;
+static int     pathTraceDepth = 0;
+static int     pathTraceMax = 0;
+
+/* FindKeyDestination cache of focus destination and ancestors up to source */
+static Widget  *pseudoTrace = NULL;
+static int     pseudoTraceDepth = 0;
+static int     pseudoTraceMax = 0;
+
+void _XtClearAncestorCache(Widget widget)
+{
+    /* the caller must lock the process lock */
+    if (pathTraceDepth && pathTrace[0] == widget)
+       pathTraceDepth = 0;
+}
+
+static XtServerGrabPtr CheckServerGrabs(
+    XEvent     *event,
+    Widget     *trace,
+    Cardinal   traceDepth)
+{
+    XtServerGrabPtr    grab;
+    Cardinal           i;
+
+    for (i = traceDepth;  i > 0; i--)
+      {
+        if ((grab = _XtCheckServerGrabsOnWidget(event, trace[i-1], KEYBOARD)))
+          return (grab);
+     }
+    return (XtServerGrabPtr)0;
+}
+
+static Boolean IsParent(Widget a, Widget b)
+{
+    for (b = XtParent(b); b; b = XtParent(b)) {
+      if (b == a) return TRUE;
+      if (XtIsShell(b)) return FALSE;
+    }
+    return FALSE;
+}
+
+#define RelRtn(lca, type) {*relTypeRtn = type; return lca;}
+
+static Widget CommonAncestor(
+    register Widget a,
+    register Widget b,
+    XtGeneology  * relTypeRtn)
+{
+    if (a == b)
+      {
+         RelRtn(a, XtMySelf)
+       }
+    else if (IsParent(a, b))
+      {
+         RelRtn(a, XtMyAncestor)
+       }
+    else if (IsParent(b, a))
+      {
+         RelRtn(b, XtMyDescendant)
+       }
+    else
+      for (b = XtParent(b);
+          b && !XtIsShell(b);
+          b = XtParent(b))
+       if (IsParent(b, a))
+         {
+             RelRtn(b, XtMyCousin)
+           }
+    RelRtn(NULL, XtUnrelated)
+}
+#undef RelRtn
+
+
+
+
+
+static Widget _FindFocusWidget(
+    Widget     widget,
+    Widget     *trace,
+    int                traceDepth,
+    Boolean    activeCheck,
+    Boolean    *isTarget)
+{
+    int src;
+    Widget dst;
+    XtPerWidgetInput   pwi = NULL;
+
+    /* For each ancestor, starting at the top, see if it's forwarded */
+
+
+    /* first check the trace list till done or we go to branch */
+    for (src = traceDepth-1, dst = widget; src > 0;)
+      {
+         if ((pwi = _XtGetPerWidgetInput(trace[src], FALSE)))
+           {
+               if (pwi->focusKid)
+                 {
+                     dst = pwi->focusKid;
+                     for (src--; src > 0 && trace[src] != dst; src--) {}
+                 }
+               else dst = trace[--src];
+           }
+         else dst = trace[--src];
+      }
+
+    if (isTarget) {
+       if (pwi && pwi->focusKid == widget)
+           *isTarget = TRUE;
+       else
+           *isTarget = FALSE;
+    }
+
+    if (!activeCheck)
+      while (XtIsWidget(dst)
+            && (pwi = _XtGetPerWidgetInput(dst, FALSE))
+            && pwi->focusKid)
+       dst = pwi->focusKid;
+
+    return dst;
+}
+
+
+static Widget FindFocusWidget(
+    Widget             widget,
+    XtPerDisplayInput  pdi)
+{
+    if (pdi->focusWidget)
+      return  pdi->focusWidget;
+    else
+      return _FindFocusWidget(widget, pdi->trace, pdi->traceDepth, FALSE, NULL);
+}
+
+Widget XtGetKeyboardFocusWidget(Widget widget)
+{
+    XtPerDisplayInput pdi;
+    Widget retval;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    pdi = _XtGetPerDisplayInput(XtDisplay(widget));
+    retval = FindFocusWidget(widget, pdi);
+    UNLOCK_APP(app);
+    return retval;
+}
+
+static Boolean IsOutside(
+    XKeyEvent  *e,
+    Widget     w)
+{
+    Position left, right, top, bottom;
+
+    /*
+     * if the pointer is outside the shell or inside
+     * the window try to see if it would recieve the
+     * focus
+     */
+    XtTranslateCoords(w, 0, 0, &left, &top);
+    /* We need to take borders into consideration */
+    left = left - w->core.border_width;
+    top =  top - w->core.border_width;
+    right = left +  w->core.width + w->core.border_width;
+    bottom = top +  w->core.height + w->core.border_width;
+
+    if (
+       (e->x_root < left) || (e->y_root < top) ||
+        (e->x_root > right) || (e->y_root > bottom))
+      return TRUE;
+    else
+      return FALSE;
+}
+
+static Widget  FindKeyDestination(
+    Widget             widget,
+    XKeyEvent          *event,
+    XtServerGrabPtr    prevGrab,
+    XtServerGrabType   prevGrabType,
+    XtServerGrabPtr    devGrab,
+    XtServerGrabType   devGrabType,
+    XtPerDisplayInput  pdi)
+{
+
+    Widget             dspWidget;
+    Widget             focusWidget;
+
+    LOCK_PROCESS;
+    dspWidget =
+      focusWidget =
+       pdi->focusWidget =
+         _GetWindowedAncestor(FindFocusWidget(widget, pdi));
+
+
+    /*
+     * If a grab is active from a previous activation then dispatch
+     * based on owner_events ala protocol but with focus being
+     * determined by XtSetKeyboardFocus.
+     */
+    if         (IsAnyGrab(prevGrabType))
+      {
+         if (prevGrab->ownerEvents)
+           dspWidget = focusWidget;
+         else
+           dspWidget = prevGrab->widget;
+      }
+    else
+      {
+         /*
+           * If the focus widget is the event widget or a descendant
+          * then we can avoid the rest of this. Else ugh...
+          */
+         if (focusWidget != widget)
+           {
+               XtGeneology     ewRelFw; /* relationship of event widget to
+                                           focusWidget */
+               Widget          lca;
+
+               lca = CommonAncestor(widget, focusWidget, &ewRelFw);
+
+               /*
+                * if the event widget is an ancestor of focus due to the pointer
+                * and/or the grab being in an ancestor and it's a passive grab
+                * send to grab widget.
+                * we are also dispatching to widget if ownerEvents and the event
+                * is outside the client
+                */
+               if ((ewRelFw == XtMyAncestor) &&
+                   (devGrabType == XtPassiveServerGrab))
+                    {
+                        if (IsOutside(event, widget) ||
+                            event->type ==KeyPress
+                            )
+                          dspWidget = devGrab->widget;
+                    }
+               else
+                 {
+                     /*
+                      * if the grab widget is not an ancestor of the focus
+                      * release the grab in order to avoid locking. There
+                      * is a possible case  in that ownerEvents true will fall
+                      * through and if synch is set and the event widget
+                      * could turn it off we'll lock. check for it ? why not
+                      */
+                     if ((ewRelFw != XtMyAncestor)
+                         && (devGrabType == XtPassiveServerGrab)
+                         && (!IsAnyGrab(prevGrabType))
+                         )
+                       {
+                           XtUngrabKeyboard(devGrab->widget,
+                                            event->time);
+                           devGrabType = XtNoServerGrab;
+                       }
+                     /*
+                      * if there isn't a grab with then check
+                      * for a logical grab that would have been activated
+                      * if the server was using Xt focus instead of server
+                      * focus
+                      */
+                     if (
+                         (event->type != KeyPress) ||
+                         (event->keycode == 0) /* Xlib XIM composed input */
+                         )
+                       dspWidget = focusWidget;
+                     else
+                       {
+                           XtServerGrabPtr     grab;
+
+                           if (!pseudoTraceDepth ||
+                               !(focusWidget == pseudoTrace[0]) ||
+                               !(lca == pseudoTrace[pseudoTraceDepth]))
+                             {
+                                 /*
+                                  * fill ancestor list from lca
+                                  * (non-inclusive)to focusWidget by
+                                  * passing in lca as breakWidget
+                                  */
+                                 _XtFillAncestorList(&pseudoTrace,
+                                                  &pseudoTraceMax,
+                                                  &pseudoTraceDepth,
+                                                  focusWidget,
+                                                  lca);
+                                 /* ignore lca */
+                                 pseudoTraceDepth--;
+                             }
+                           if ((grab = CheckServerGrabs((XEvent*)event,
+                                                       pseudoTrace,
+                                                       pseudoTraceDepth)))
+                             {
+                                 XtDevice device = &pdi->keyboard;
+
+                                 device->grabType = XtPseudoPassiveServerGrab;
+                                 pdi->activatingKey = event->keycode;
+                                 device->grab = *grab;
+
+                                 if (grab
+                                     )
+                                   dspWidget = grab->widget;
+                                 else
+                                   dspWidget = focusWidget;
+                             }
+                       }
+                 }
+           }
+      }
+    UNLOCK_PROCESS;
+    return dspWidget;
+}
+
+Widget _XtProcessKeyboardEvent(
+    XKeyEvent  *event,
+    Widget widget,
+    XtPerDisplayInput pdi)
+{
+    XtDevice           device = &pdi->keyboard;
+    XtServerGrabPtr    newGrab, devGrab = &device->grab;
+    XtServerGrabRec    prevGrabRec;
+    XtServerGrabType   prevGrabType = device->grabType;
+    Widget             dspWidget = NULL;
+    Boolean            deactivateGrab = FALSE;
+
+    prevGrabRec = *devGrab;
+
+    switch (event->type)
+      {
+       case KeyPress:
+         {
+             if (event->keycode != 0 && /* Xlib XIM composed input */
+                 !IsServerGrab(device->grabType) &&
+                 (newGrab = CheckServerGrabs((XEvent*)event,
+                                             pdi->trace,
+                                             pdi->traceDepth)))
+               {
+                   /*
+                    * honor pseudo-grab from prior event by X
+                    * unlocking keyboard. Not Xt Unlock !
+                    */
+                   if (IsPseudoGrab(prevGrabType))
+                     XUngrabKeyboard(XtDisplay(newGrab->widget),
+                                     event->time);
+                   else
+                     {
+                         /* Activate the grab */
+                         device->grab = *newGrab;
+                         pdi->activatingKey = event->keycode;
+                         device->grabType = XtPassiveServerGrab;
+                     }
+               }
+           }
+         break;
+
+       case KeyRelease:
+         {
+             if (IsEitherPassiveGrab(device->grabType) &&
+                 (event->keycode == pdi->activatingKey))
+               deactivateGrab = TRUE;
+         }
+         break;
+      }
+    dspWidget = FindKeyDestination(widget, event,
+                                  &prevGrabRec, prevGrabType,
+                                  devGrab, device->grabType,
+                                  pdi);
+    if (deactivateGrab)
+      {
+         /* Deactivate the grab */
+         device->grabType = XtNoServerGrab;
+         pdi->activatingKey = 0;
+      }
+    return dspWidget;
+}
+
+static Widget GetShell(Widget widget)
+{
+    Widget     shell;
+
+    for (shell = widget;
+        shell && !XtIsShell(shell);
+        shell = XtParent(shell)){}
+    return shell;
+}
+
+
+/*
+ * Check that widget really has Xt focus due to it having recieved an
+ * event
+ */
+typedef enum {NotActive = 0, IsActive, IsTarget} ActiveType;
+static ActiveType InActiveSubtree(Widget widget)
+{
+    Boolean            isTarget;
+    ActiveType         retval;
+
+    LOCK_PROCESS;
+    if (!pathTraceDepth || widget != pathTrace[0]) {
+       _XtFillAncestorList(&pathTrace,
+                           &pathTraceMax,
+                           &pathTraceDepth,
+                           widget,
+                           NULL);
+    }
+    if (widget == _FindFocusWidget(widget,
+                                  pathTrace,
+                                  pathTraceDepth,
+                                  TRUE,
+                                  &isTarget))
+       retval = (isTarget ? IsTarget : IsActive);
+    else
+       retval = NotActive;
+    UNLOCK_PROCESS;
+    return retval;
+}
+
+
+
+
+/* ARGSUSED */
+void _XtHandleFocus(
+    Widget widget,
+    XtPointer client_data,     /* child who wants focus */
+    XEvent *event,
+    Boolean *cont)             /* unused */
+{
+    XtPerDisplayInput  pdi = _XtGetPerDisplayInput(XtDisplay(widget));
+    XtPerWidgetInput   pwi = (XtPerWidgetInput)client_data;
+    XtGeneology                oldFocalPoint = pwi->focalPoint;
+    XtGeneology                newFocalPoint = pwi->focalPoint;
+
+    switch( event->type ) {
+
+      case KeyPress:
+      case KeyRelease:
+       /*
+        * We're getting the keyevents used to guarantee propagating
+         * child interest ala ForwardEvent in R3
+        */
+       return;
+
+      case EnterNotify:
+      case LeaveNotify:
+
+       /*
+        * If operating in a focus driven model, then enter and
+        * leave events do not affect the keyboard focus.
+        */
+       if ((event->xcrossing.detail != NotifyInferior)
+           &&  (event->xcrossing.focus))
+         {
+             switch (oldFocalPoint)
+               {
+                 case XtMyAncestor:
+                   if (event->type == LeaveNotify)
+                     newFocalPoint = XtUnrelated;
+                   break;
+                 case XtUnrelated:
+                   if (event->type == EnterNotify)
+                     newFocalPoint = XtMyAncestor;
+                   break;
+                 case XtMySelf:
+                   break;
+                 case XtMyDescendant:
+                   break;
+
+               }
+         }
+       break;
+      case FocusIn:
+       switch (event->xfocus.detail)
+         {
+           case NotifyNonlinear:
+           case NotifyAncestor:
+           case NotifyInferior:
+             newFocalPoint = XtMySelf;
+             break;
+           case NotifyNonlinearVirtual:
+           case NotifyVirtual:
+             newFocalPoint = XtMyDescendant;
+             break;
+           case NotifyPointer:
+             newFocalPoint = XtMyAncestor;
+             break;
+         }
+       break;
+      case FocusOut:
+       switch (event->xfocus.detail)
+         {
+           case NotifyPointer:
+           case NotifyNonlinear:
+           case NotifyAncestor:
+           case NotifyNonlinearVirtual:
+           case NotifyVirtual:
+             newFocalPoint = XtUnrelated;
+             break;
+           case NotifyInferior:
+             newFocalPoint = XtMyDescendant;
+             return;
+             break;
+         }
+       break;
+    }
+
+    if (newFocalPoint != oldFocalPoint)
+      {
+         Boolean       add;
+         Widget        descendant = pwi->focusKid;
+
+         pwi->focalPoint = newFocalPoint;
+
+         if ((oldFocalPoint == XtUnrelated) &&
+             InActiveSubtree(widget) != NotActive)
+           {
+               pdi->focusWidget = NULL; /* invalidate the cache */
+               pwi->haveFocus = TRUE;
+               add = TRUE;
+           }
+         else if (newFocalPoint == XtUnrelated)
+           {
+               pdi->focusWidget = NULL; /* invalidate the cache */
+               pwi->haveFocus = FALSE;
+               add = FALSE;
+           }
+         else
+           return;
+
+         if (descendant)
+           {
+               if (add)
+                 {
+                     _XtSendFocusEvent(descendant, FocusIn);
+                 }
+               else
+                 {
+                     _XtSendFocusEvent(descendant, FocusOut);
+                 }
+           }
+      }
+}
+
+
+static void AddFocusHandler(
+    Widget widget,
+    Widget descendant,
+    XtPerWidgetInput pwi,
+    XtPerWidgetInput psi,
+    XtPerDisplayInput pdi,
+    EventMask oldEventMask)
+{
+    EventMask          eventMask, targetEventMask;
+    Widget             target;
+
+    /*
+     * widget must now select for key events if the descendant is
+     * interested in them.
+     *
+     * shell borders are not occluded by the child, they're occluded
+     * by reparenting window managers. !!!
+     */
+    target = descendant ? _GetWindowedAncestor(descendant) : NULL;
+    targetEventMask = XtBuildEventMask(target);
+    eventMask = targetEventMask & (KeyPressMask | KeyReleaseMask);
+    eventMask |= FocusChangeMask | EnterWindowMask | LeaveWindowMask;
+
+    if (oldEventMask) {
+       oldEventMask &= KeyPressMask | KeyReleaseMask;
+       oldEventMask |= FocusChangeMask | EnterWindowMask | LeaveWindowMask;
+
+       if (oldEventMask != eventMask)
+           XtRemoveEventHandler(widget, (oldEventMask & ~eventMask),
+                                False, _XtHandleFocus, (XtPointer)pwi);
+    }
+
+    if (oldEventMask != eventMask)
+       XtAddEventHandler(widget, eventMask, False,
+                         _XtHandleFocus, (XtPointer)pwi);
+
+    /* What follows is too much grief to go through if the
+     * target doesn't actually care about focus change events,
+     * so just invalidate the focus cache & refill it when
+     * the next input event actually arrives.
+     */
+
+    if (!(targetEventMask & FocusChangeMask)) {
+       pdi->focusWidget = NULL;
+       return;
+    }
+
+    if (XtIsRealized(widget) && !pwi->haveFocus) {
+       if (psi->haveFocus) {
+           Window root, child;
+           int root_x, root_y, win_x, win_y;
+           int left, right, top, bottom;
+           unsigned int modMask;
+           ActiveType act;
+
+           /*
+            * If the shell has the focus but the source widget
+            * doesn't, it may only be because the source widget
+            * wasn't previously tracking focus or crossing events.
+            * If the target wants focus events, we have to
+            * now determine whether the source has the focus.
+            */
+
+           if ((act = InActiveSubtree(widget)) == IsTarget)
+               pwi->haveFocus = TRUE;
+           else if (act == IsActive) {
+               /*
+                * An ancestor contains the focus, so if source
+                * contains the pointer, then source has the focus.
+                */
+
+               if (XQueryPointer(XtDisplay(widget), XtWindow(widget),
+                                 &root, &child,
+                                 &root_x, &root_y, &win_x, &win_y, &modMask))
+               {
+                   /* We need to take borders into consideration */
+                   left = top = -((int) widget->core.border_width);
+                   right = (int) (widget->core.width + (widget->core.border_width << 1));
+                   bottom = (int) (widget->core.height + (widget->core.border_width << 1));
+
+                   if (win_x >= left && win_x < right &&
+                       win_y >= top && win_y < bottom)
+                       pwi->haveFocus = TRUE;
+               }
+           }
+       }
+    }
+    if (pwi->haveFocus) {
+         pdi->focusWidget = NULL; /* invalidate the cache */
+         _XtSendFocusEvent(target, FocusIn);
+    }
+}
+
+
+/* ARGSUSED */
+static void QueryEventMask(
+    Widget widget,             /* child who gets focus */
+    XtPointer client_data,     /* ancestor giving it */
+    XEvent *event,
+    Boolean *cont)             /* unused */
+{
+    /* widget was once the target of an XtSetKeyboardFocus but
+     * was unrealized at the time.   Make sure ancestor still wants
+     * focus set here then install the handler now that we know the
+     * complete event mask.
+     */
+    Widget ancestor = (Widget)client_data;
+    XtPerWidgetInput pwi = _XtGetPerWidgetInput(ancestor, FALSE);
+
+    if (pwi) {
+       Widget target = pwi->queryEventDescendant;
+
+       /* use of 'target' is non-standard hackery;
+          allows focus to non-widget */
+       if ( pwi->focusKid == target ) {
+           AddFocusHandler(ancestor, target, pwi,
+                           _XtGetPerWidgetInput(GetShell(ancestor), TRUE),
+                           _XtGetPerDisplayInput(XtDisplay(ancestor)),
+                           (EventMask)0);
+       }
+       XtRemoveEventHandler(widget, XtAllEvents, True,
+                            QueryEventMask, client_data);
+       pwi->map_handler_added = FALSE;
+    }
+}
+
+
+/* ARGSUSED */
+static void FocusDestroyCallback(
+    Widget  widget,
+    XtPointer closure,         /* Widget */
+    XtPointer call_data)
+{
+    XtSetKeyboardFocus((Widget)closure, NULL);
+}
+
+void XtSetKeyboardFocus(
+    Widget widget,
+    Widget descendant)
+{
+    XtPerDisplayInput pdi;
+    XtPerWidgetInput pwi;
+    Widget oldDesc, oldTarget, target, hookobj;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    pdi = _XtGetPerDisplayInput(XtDisplay(widget));
+    pwi = _XtGetPerWidgetInput(widget, TRUE);
+    oldDesc = pwi->focusKid;
+
+    if (descendant == widget) descendant = (Widget)None;
+
+    target = descendant ? _GetWindowedAncestor(descendant) : NULL;
+    oldTarget = oldDesc ? _GetWindowedAncestor(oldDesc) : NULL;
+
+    if (descendant != oldDesc) {
+
+       /* update the forward path */
+       pwi->focusKid = descendant;
+
+
+       /* all the rest handles focus ins and focus outs and misc gunk */
+
+       if (oldDesc) {
+           /* invalidate FindKeyDestination's ancestor list */
+           if (pseudoTraceDepth && oldTarget == pseudoTrace[0])
+               pseudoTraceDepth = 0;
+
+           XtRemoveCallback(oldDesc, XtNdestroyCallback,
+                            FocusDestroyCallback, (XtPointer)widget);
+
+           if (!oldTarget->core.being_destroyed) {
+               if (pwi->map_handler_added) {
+                   XtRemoveEventHandler(oldTarget, XtAllEvents, True,
+                                        QueryEventMask, (XtPointer)widget);
+                   pwi->map_handler_added = FALSE;
+               }
+               if (pwi->haveFocus) {
+                   _XtSendFocusEvent( oldTarget, FocusOut);
+               }
+           }
+           else if (pwi->map_handler_added) {
+               pwi->map_handler_added = FALSE;
+           }
+
+           if (pwi->haveFocus)
+               pdi->focusWidget = NULL; /* invalidate cache */
+
+           /*
+            * If there was a forward path then remove the handler if
+            * the path is being set to null and it isn't a shell.
+            * shells always have a handler for tracking focus for the
+            * hierarchy.
+            *
+            * Keep the pwi record on the assumption that the client
+            * will continue to dynamically assign focus for this widget.
+            */
+           if (!XtIsShell(widget) && !descendant) {
+             XtRemoveEventHandler(widget, XtAllEvents, True,
+                                  _XtHandleFocus, (XtPointer)pwi);
+             pwi->haveFocus = FALSE;
+         }
+       }
+
+       if (descendant) {
+           Widget shell = GetShell(widget);
+           XtPerWidgetInput psi = _XtGetPerWidgetInput(shell, TRUE);
+           XtAddCallback (descendant, XtNdestroyCallback,
+                          FocusDestroyCallback, (XtPointer) widget);
+
+           AddFocusHandler(widget, descendant, pwi, psi, pdi,
+                           oldTarget ? XtBuildEventMask(oldTarget) : 0);
+
+           if (widget != shell)
+               XtAddEventHandler(
+                       shell,
+                       FocusChangeMask | EnterWindowMask | LeaveWindowMask,
+                       False,
+                       _XtHandleFocus,
+                       (XtPointer)psi
+                      );
+
+           if (! XtIsRealized(target)) {
+               XtAddEventHandler(target, (EventMask)StructureNotifyMask,
+                                 False, QueryEventMask, (XtPointer)widget);
+               pwi->map_handler_added = TRUE;
+               pwi->queryEventDescendant = descendant;
+           }
+       }
+    }
+    hookobj = XtHooksOfDisplay(XtDisplay(widget));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+       XtChangeHookDataRec call_data;
+
+       call_data.type = XtHsetKeyboardFocus;
+       call_data.widget = widget;
+       call_data.event_data = (XtPointer) descendant;
+       XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.changehook_callbacks,
+               (XtPointer)&call_data);
+    }
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+}
diff --git a/src/Makefile.am b/src/Makefile.am
new file mode 100644 (file)
index 0000000..cf54a5c
--- /dev/null
@@ -0,0 +1,105 @@
+lib_LTLIBRARIES = libXt.la
+
+BUILT_SOURCES = $(BUILT_FILES)
+CLEANFILES = $(BUILT_SOURCES)
+
+SRCH_DEFINES = -DXFILESEARCHPATHDEFAULT=\"$(XFILESEARCHPATHDEFAULT)\"
+ERRORDB_DEFINES = -DERRORDB=\"$(libdir)/X11/XtErrorDB\"
+
+AM_CFLAGS = $(CWARNFLAGS) $(XT_CFLAGS) $(SRCH_DEFINES) $(ERRORDB_DEFINES) \
+       $(XTMALLOC_ZERO_CFLAGS)
+
+INCLUDES = -I$(top_srcdir)/include/ -I$(top_srcdir)/include/X11 \
+          -I$(top_builddir)/include -I$(top_builddir)/include/X11
+
+nodist_libXt_la_SOURCES = StringDefs.c
+
+libXt_la_SOURCES = \
+       ActionHook.c \
+       Alloc.c \
+       ArgList.c \
+       Callback.c \
+       ClickTime.c \
+       Composite.c \
+       Constraint.c \
+       Convert.c \
+       Converters.c \
+       Core.c \
+       Create.c \
+       Destroy.c \
+       Display.c \
+       Error.c \
+       Event.c \
+       EventUtil.c \
+       Functions.c \
+       GCManager.c \
+       Geometry.c \
+       GetActKey.c \
+       GetResList.c \
+       GetValues.c \
+       HookObj.c \
+       Hooks.c \
+       Initialize.c \
+       Intrinsic.c \
+       Keyboard.c \
+       Manage.c \
+       NextEvent.c \
+       Object.c \
+       PassivGrab.c \
+       Pointer.c \
+       Popup.c \
+       PopupCB.c \
+       RectObj.c \
+       ResConfig.c \
+       Resources.c \
+       Selection.c \
+       SetSens.c \
+       SetValues.c \
+       SetWMCW.c \
+       Shell.c \
+       TMaction.c \
+       TMgrab.c \
+       TMkey.c \
+       TMparse.c \
+       TMprint.c \
+       TMstate.c \
+       Threads.c \
+       VarCreate.c \
+       VarGet.c \
+       Varargs.c \
+       Vendor.c \
+       sharedlib.c
+
+DISTCLEANFILES = StringDefs.c
+
+libXt_la_LIBADD = @XT_LIBS@
+
+libXt_la_LDFLAGS = -version-number 6:0:0 -no-undefined
+
+#
+# The util directory contains a program that builds some of the sources.
+# The input to this program is given in files. Unfortunately those input
+# files refers to things like
+#
+#      util/foo
+#
+# so the generating program must be run from the top directory.
+#
+
+BUILT_SOURCE = StringDefs.c
+BUILT_HEADER = $(top_builddir)/include/X11/StringDefs.h $(top_builddir)/include/X11/Shell.h
+BUILT_FILES = $(BUILT_SOURCE) $(BUILT_HEADER)
+
+STRING_LIST = $(top_srcdir)/util/string.list
+
+all-local: $(BUILT_FILES)
+
+$(BUILT_HEADER): $(BUILT_SOURCE)
+
+$(BUILT_SOURCE):
+       $(AM_V_GEN)$(top_builddir)/util/makestrs -i $(top_srcdir) $(STRINGSABIOPTIONS) < $(STRING_LIST) > StringDefs.c
+       $(AM_V_at)mkdir -p $(top_builddir)/src
+       $(AM_V_at)mkdir -p $(top_builddir)/include/X11
+       $(AM_V_at)cp StringDefs.h $(top_builddir)/include/X11
+       $(AM_V_at)cp Shell.h $(top_builddir)/include/X11
+       $(AM_V_at)rm StringDefs.h Shell.h
diff --git a/src/Manage.c b/src/Manage.c
new file mode 100644 (file)
index 0000000..575be7d
--- /dev/null
@@ -0,0 +1,499 @@
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+
+static String XtNinvalidChild = "invalidChild";
+static String XtNxtUnmanageChildren = "xtUnmanageChildren";
+static String XtNxtManageChildren = "xtManageChildren";
+static String XtNxtChangeManagedSet = "xtChangeManagedSet";
+
+static void UnmanageChildren(
+    WidgetList children,
+    Cardinal num_children,
+    Widget parent,
+    Cardinal* num_unique_children,
+    Boolean call_change_managed,
+    String caller_func)
+{
+    Widget             child;
+    Cardinal           i;
+    XtWidgetProc       change_managed = NULL;
+    Bool               parent_realized = False;
+
+    *num_unique_children = 0;
+
+    if (XtIsComposite((Widget) parent)) {
+       LOCK_PROCESS;
+        change_managed = ((CompositeWidgetClass) parent->core.widget_class)
+                   ->composite_class.change_managed;
+       UNLOCK_PROCESS;
+       parent_realized = XtIsRealized((Widget)parent);
+    } else {
+        XtAppErrorMsg(XtWidgetToApplicationContext((Widget)parent),
+                     "invalidParent",caller_func, XtCXtToolkitError,
+                  "Attempt to unmanage a child when parent is not Composite",
+                     (String *) NULL, (Cardinal *) NULL);
+    }
+
+    for (i = 0; i < num_children; i++) {
+       child = children[i];
+       if (child == NULL) {
+           XtAppWarningMsg(XtWidgetToApplicationContext(parent),
+                 XtNinvalidChild,caller_func,XtCXtToolkitError,
+                  "Null child passed to XtUnmanageChildren",
+                 (String *)NULL, (Cardinal *)NULL);
+           return;
+       }
+        if (child->core.parent != parent) {
+          XtAppWarningMsg(XtWidgetToApplicationContext(parent),
+                  "ambiguousParent",caller_func,XtCXtToolkitError,
+           "Not all children have same parent in UnmanageChildren",
+             (String *)NULL, (Cardinal *)NULL);
+       } else
+        if (child->core.managed) {
+            (*num_unique_children)++;
+           CALLGEOTAT(_XtGeoTrace(child,"Child \"%s\" is marked unmanaged\n",
+                          XtName(child)));
+           child->core.managed = FALSE;
+            if (XtIsWidget(child)
+               && XtIsRealized(child)
+               && child->core.mapped_when_managed)
+                    XtUnmapWidget(child);
+            else
+           { /* RectObj child */
+               Widget pw = child->core.parent;
+               RectObj r = (RectObj) child;
+               while ((pw!=NULL) && (!XtIsWidget(pw))) pw = pw->core.parent;
+               if ((pw!=NULL) && XtIsRealized (pw))
+                   XClearArea (XtDisplay (pw), XtWindow (pw),
+                       r->rectangle.x, r->rectangle.y,
+                       r->rectangle.width + (r->rectangle.border_width << 1),
+                       r->rectangle.height + (r->rectangle.border_width << 1),
+                       TRUE);
+           }
+
+        }
+    }
+    if (call_change_managed && *num_unique_children != 0 &&
+       change_managed != NULL && parent_realized) {
+       CALLGEOTAT(_XtGeoTrace((Widget)parent,
+                      "Call parent: \"%s\"[%d,%d]'s changemanaged proc\n",
+                      XtName((Widget)parent),
+                      parent->core.width,parent->core.height));
+       (*change_managed) (parent);
+    }
+} /* UnmanageChildren */
+
+void XtUnmanageChildren (
+    WidgetList children,
+    Cardinal num_children)
+{
+    Widget parent, hookobj;
+    Cardinal ii;
+#ifdef XTHREADS
+    XtAppContext app;
+#endif
+
+    if (num_children == 0) return;
+    if (children[0] == NULL) {
+       XtWarningMsg(XtNinvalidChild,XtNxtUnmanageChildren,XtCXtToolkitError,
+                    "Null child found in argument list to unmanage",
+                    (String *)NULL, (Cardinal *)NULL);
+       return;
+    }
+#ifdef XTHREADS
+    app = XtWidgetToApplicationContext(children[0]);
+#endif
+    LOCK_APP(app);
+    parent = children[0]->core.parent;
+    if (parent->core.being_destroyed) {
+       UNLOCK_APP(app);
+       return;
+    }
+    UnmanageChildren(children, num_children, parent, &ii,
+                    (Boolean)True, XtNxtUnmanageChildren);
+    hookobj = XtHooksOfDisplay(XtDisplayOfObject(children[0]));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+       XtChangeHookDataRec call_data;
+
+       call_data.type = XtHunmanageChildren;
+       call_data.widget = parent;
+       call_data.event_data = (XtPointer) children;
+       call_data.num_event_data = num_children;
+       XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.changehook_callbacks,
+               (XtPointer)&call_data);
+    }
+    UNLOCK_APP(app);
+} /* XtUnmanageChildren */
+
+void XtUnmanageChild(
+    Widget child)
+{
+    XtUnmanageChildren(&child, (Cardinal)1);
+} /* XtUnmanageChild */
+
+
+static void ManageChildren(
+    WidgetList  children,
+    Cardinal    num_children,
+    Widget     parent,
+    Boolean    call_change_managed,
+    String     caller_func)
+{
+#define MAXCHILDREN 100
+    Widget             child;
+    Cardinal           num_unique_children, i;
+    XtWidgetProc       change_managed = NULL;
+    WidgetList         unique_children;
+    Widget             cache[MAXCHILDREN];
+    Bool               parent_realized = False;
+
+    if (XtIsComposite((Widget) parent)) {
+       LOCK_PROCESS;
+        change_managed = ((CompositeWidgetClass) parent->core.widget_class)
+                   ->composite_class.change_managed;
+       UNLOCK_PROCESS;
+       parent_realized = XtIsRealized((Widget)parent);
+    } else {
+       XtAppErrorMsg(XtWidgetToApplicationContext((Widget)parent),
+               "invalidParent",caller_func, XtCXtToolkitError,
+           "Attempt to manage a child when parent is not Composite",
+           (String *) NULL, (Cardinal *) NULL);
+    }
+
+    /* Construct new list of children that really need to be operated upon. */
+    if (num_children <= MAXCHILDREN) {
+       unique_children = cache;
+    } else {
+       unique_children = (WidgetList) __XtMalloc(num_children * sizeof(Widget));
+    }
+    num_unique_children = 0;
+    for (i = 0; i < num_children; i++) {
+       child = children[i];
+       if (child == NULL) {
+           XtAppWarningMsg(XtWidgetToApplicationContext((Widget)parent),
+               XtNinvalidChild,caller_func,XtCXtToolkitError,
+               "null child passed to ManageChildren",
+               (String *)NULL, (Cardinal *)NULL);
+           if (unique_children != cache) XtFree((char *) unique_children);
+           return;
+       }
+#ifdef DEBUG
+       if (!XtIsRectObj(child)) {
+           String params[2];
+           Cardinal num_params = 2;
+           params[0] = XtName(child);
+           params[1] = child->core.widget_class->core_class.class_name;
+           XtAppWarningMsg(XtWidgetToApplicationContext((Widget)parent),
+                           "notRectObj",caller_func,XtCXtToolkitError,
+                           "child \"%s\", class %s is not a RectObj",
+                           params, &num_params);
+           continue;
+       }
+#endif /*DEBUG*/
+        if (child->core.parent != parent) {
+           XtAppWarningMsg(XtWidgetToApplicationContext((Widget)parent),
+                   "ambiguousParent",caller_func,XtCXtToolkitError,
+               "Not all children have same parent in XtManageChildren",
+               (String *)NULL, (Cardinal *)NULL);
+       } else if (! child->core.managed && !child->core.being_destroyed) {
+           unique_children[num_unique_children++] = child;
+           CALLGEOTAT(_XtGeoTrace(child,
+                          "Child \"%s\"[%d,%d] is marked managed\n",
+                          XtName(child),
+                          child->core.width,child->core.height));
+           child->core.managed = TRUE;
+       }
+    }
+
+    if ((call_change_managed || num_unique_children != 0) && parent_realized) {
+       /* Compute geometry of new managed set of children. */
+       if (change_managed != NULL) {
+           CALLGEOTAT(_XtGeoTrace((Widget)parent,
+                          "Call parent: \"%s\"[%d,%d]'s changemanaged\n",
+                          XtName((Widget)parent),
+                          parent->core.width,parent->core.height));
+           (*change_managed) ((Widget)parent);
+       }
+
+       /* Realize each child if necessary, then map if necessary */
+       for (i = 0; i < num_unique_children; i++) {
+           child = unique_children[i];
+           if (XtIsWidget(child)) {
+               if (! XtIsRealized(child)) XtRealizeWidget(child);
+               if (child->core.mapped_when_managed) XtMapWidget(child);
+           } else { /* RectObj child */
+               Widget pw = child->core.parent;
+               RectObj r = (RectObj) child;
+               while ((pw!=NULL) && (!XtIsWidget(pw)))
+                   pw = pw->core.parent;
+               if (pw != NULL)
+                   XClearArea (XtDisplay (pw), XtWindow (pw),
+                   r->rectangle.x, r->rectangle.y,
+                   r->rectangle.width + (r->rectangle.border_width << 1),
+                   r->rectangle.height + (r->rectangle.border_width << 1),
+                   TRUE);
+            }
+        }
+    }
+
+    if (unique_children != cache) XtFree((char *) unique_children);
+} /* ManageChildren */
+
+void XtManageChildren(
+    WidgetList children,
+    Cardinal num_children)
+{
+    Widget parent, hookobj;
+#ifdef XTHREADS
+    XtAppContext app;
+#endif
+
+    if (num_children == 0) return;
+    if (children[0] == NULL) {
+       XtWarningMsg(XtNinvalidChild, XtNxtManageChildren, XtCXtToolkitError,
+                    "null child passed to XtManageChildren",
+                    (String*)NULL, (Cardinal*)NULL);
+       return;
+    }
+#ifdef XTHREADS
+    app = XtWidgetToApplicationContext(children[0]);
+#endif
+    LOCK_APP(app);
+    parent = children[0]->core.parent;
+    if (parent->core.being_destroyed) {
+       UNLOCK_APP(app);
+       return;
+    }
+    ManageChildren(children, num_children, parent, (Boolean)False,
+                  XtNxtManageChildren);
+    hookobj = XtHooksOfDisplay(XtDisplayOfObject(children[0]));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+       XtChangeHookDataRec call_data;
+
+       call_data.type = XtHmanageChildren;
+       call_data.widget = parent;
+       call_data.event_data = (XtPointer) children;
+       call_data.num_event_data = num_children;
+       XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.changehook_callbacks,
+               (XtPointer)&call_data);
+    }
+    UNLOCK_APP(app);
+} /* XtManageChildren */
+
+void XtManageChild(
+    Widget child)
+{
+    XtManageChildren(&child, (Cardinal) 1);
+} /* XtManageChild */
+
+
+void XtSetMappedWhenManaged(
+    Widget widget,
+    _XtBoolean mapped_when_managed)
+{
+    Widget hookobj;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    if (widget->core.mapped_when_managed == mapped_when_managed) {
+       UNLOCK_APP(app);
+       return;
+    }
+    widget->core.mapped_when_managed = mapped_when_managed;
+
+    hookobj = XtHooksOfDisplay(XtDisplay(widget));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+       XtChangeHookDataRec call_data;
+
+       call_data.type = XtHsetMappedWhenManaged;
+       call_data.widget = widget;
+       call_data.event_data = (XtPointer) (unsigned long) mapped_when_managed;
+       XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.changehook_callbacks,
+               (XtPointer)&call_data);
+    }
+
+    if (! XtIsManaged(widget)) {
+       UNLOCK_APP(app);
+       return;
+    }
+
+    if (mapped_when_managed) {
+       /* Didn't used to be mapped when managed.               */
+       if (XtIsRealized(widget)) XtMapWidget(widget);
+    } else {
+       /* Used to be mapped when managed.                      */
+       if (XtIsRealized(widget)) XtUnmapWidget(widget);
+    }
+    UNLOCK_APP(app);
+} /* XtSetMappedWhenManaged */
+
+
+void XtChangeManagedSet(
+    WidgetList unmanage_children,
+    Cardinal num_unmanage,
+    XtDoChangeProc do_change_proc,
+    XtPointer client_data,
+    WidgetList manage_children,
+    Cardinal num_manage)
+{
+    WidgetList childp;
+    Widget parent;
+    int i;
+    Cardinal some_unmanaged;
+    Boolean call_out;
+    CompositeClassExtension ext;
+    XtAppContext app;
+    Widget hookobj;
+    XtChangeHookDataRec call_data;
+
+    if (num_unmanage == 0 && num_manage == 0)
+       return;
+
+    /* specification doesn't state that library will check for NULL in list */
+
+    childp = num_unmanage ? unmanage_children : manage_children;
+    app = XtWidgetToApplicationContext(*childp);
+    LOCK_APP(app);
+
+    parent = XtParent(*childp);
+    childp = unmanage_children;
+    for (i = num_unmanage; --i >= 0 && XtParent(*childp) == parent; childp++);
+    call_out = (i >= 0);
+    childp = manage_children;
+    for (i = num_manage;   --i >= 0 && XtParent(*childp) == parent; childp++);
+    if (call_out || i >= 0) {
+       XtAppWarningMsg(app, "ambiguousParent", XtNxtChangeManagedSet,
+                       XtCXtToolkitError, "Not all children have same parent",
+                       (String *)NULL, (Cardinal *)NULL);
+    }
+    if (! XtIsComposite(parent)) {
+       UNLOCK_APP(app);
+       XtAppErrorMsg(app, "invalidParent", XtNxtChangeManagedSet,
+                     XtCXtToolkitError,
+                     "Attempt to manage a child when parent is not Composite",
+                     (String *) NULL, (Cardinal *) NULL);
+    }
+    if (parent->core.being_destroyed) {
+       UNLOCK_APP(app);
+       return;
+    }
+
+    call_out = False;
+    if (do_change_proc) {
+       ext = (CompositeClassExtension)
+           XtGetClassExtension(parent->core.widget_class,
+                               XtOffsetOf(CompositeClassRec,
+                                          composite_class.extension),
+                               NULLQUARK, XtCompositeExtensionVersion,
+                               sizeof(CompositeClassExtensionRec));
+       if (!ext || !ext->allows_change_managed_set)
+           call_out = True;
+    }
+
+    UnmanageChildren(unmanage_children, num_unmanage, parent,
+                    &some_unmanaged, call_out, XtNxtChangeManagedSet);
+
+    hookobj = XtHooksOfDisplay(XtDisplay(parent));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+       call_data.type = XtHunmanageSet;
+       call_data.widget = parent;
+       call_data.event_data = (XtPointer) unmanage_children;
+       call_data.num_event_data = num_unmanage;
+       XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.changehook_callbacks,
+               (XtPointer) &call_data);
+    }
+
+    if (do_change_proc)
+       (*do_change_proc)(parent, unmanage_children, &num_unmanage,
+                         manage_children, &num_manage, client_data);
+
+    call_out = (some_unmanaged && !call_out);
+    ManageChildren(manage_children, num_manage, parent, call_out,
+                  XtNxtChangeManagedSet);
+
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+       call_data.type = XtHmanageSet;
+       call_data.event_data = (XtPointer) manage_children;
+       call_data.num_event_data = num_manage;
+       XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.changehook_callbacks,
+               (XtPointer) &call_data);
+    }
+    UNLOCK_APP(app);
+} /* XtChangeManagedSet */
diff --git a/src/NextEvent.c b/src/NextEvent.c
new file mode 100644 (file)
index 0000000..b1f7bc7
--- /dev/null
@@ -0,0 +1,1632 @@
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1994, 1998, 2001  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include <stdio.h>
+#include <errno.h>
+
+#ifdef __UNIXOS2__
+#include <sys/time.h>
+#endif
+
+static TimerEventRec* freeTimerRecs;
+static WorkProcRec* freeWorkRecs;
+static SignalEventRec* freeSignalRecs;
+
+/* Some systems running NTP daemons are known to return strange usec
+ * values from gettimeofday.
+ */
+
+#ifndef NEEDS_NTPD_FIXUP
+# if defined(sun) || defined(MOTOROLA) || (defined(__osf__) && defined(__alpha))
+#  define NEEDS_NTPD_FIXUP 1
+# else
+#  define NEEDS_NTPD_FIXUP 0
+# endif
+#endif
+
+#if NEEDS_NTPD_FIXUP
+#define FIXUP_TIMEVAL(t) { \
+       while ((t).tv_usec >= 1000000) { \
+           (t).tv_usec -= 1000000; \
+           (t).tv_sec++; \
+       } \
+       while ((t).tv_usec < 0) { \
+           if ((t).tv_sec > 0) { \
+               (t).tv_usec += 1000000; \
+               (t).tv_sec--; \
+           } else { \
+               (t).tv_usec = 0; \
+               break; \
+           } \
+       }}
+#else
+#define FIXUP_TIMEVAL(t)
+#endif /*NEEDS_NTPD_FIXUP*/
+
+/*
+ * Private routines
+ */
+#define ADD_TIME(dest, src1, src2) { \
+       if(((dest).tv_usec = (src1).tv_usec + (src2).tv_usec) >= 1000000) {\
+             (dest).tv_usec -= 1000000;\
+             (dest).tv_sec = (src1).tv_sec + (src2).tv_sec + 1 ; \
+       } else { (dest).tv_sec = (src1).tv_sec + (src2).tv_sec ; \
+          if(((dest).tv_sec >= 1) && (((dest).tv_usec <0))) { \
+           (dest).tv_sec --;(dest).tv_usec += 1000000; } } }
+
+
+#define TIMEDELTA(dest, src1, src2) { \
+       if(((dest).tv_usec = (src1).tv_usec - (src2).tv_usec) < 0) {\
+             (dest).tv_usec += 1000000;\
+             (dest).tv_sec = (src1).tv_sec - (src2).tv_sec - 1;\
+       } else  (dest).tv_sec = (src1).tv_sec - (src2).tv_sec;  }
+
+#define IS_AFTER(t1, t2) (((t2).tv_sec > (t1).tv_sec) \
+       || (((t2).tv_sec == (t1).tv_sec)&& ((t2).tv_usec > (t1).tv_usec)))
+
+#define IS_AT_OR_AFTER(t1, t2) (((t2).tv_sec > (t1).tv_sec) \
+       || (((t2).tv_sec == (t1).tv_sec)&& ((t2).tv_usec >= (t1).tv_usec)))
+
+#ifdef USE_POLL
+#ifndef XT_DEFAULT_FDLIST_SIZE
+#define XT_DEFAULT_FDLIST_SIZE 32
+#endif
+#endif
+
+static void AdjustHowLong (
+       unsigned long *howlong,
+       struct timeval *start_time)
+{
+       struct timeval new_time, time_spent, lstart_time;
+
+       lstart_time = *start_time;
+       X_GETTIMEOFDAY (&new_time);
+       FIXUP_TIMEVAL(new_time);
+       TIMEDELTA(time_spent, new_time, lstart_time);
+       if(*howlong <= (unsigned long)(time_spent.tv_sec*1000+time_spent.tv_usec/1000))
+           *howlong = (unsigned long)0;  /* Timed out */
+       else
+           *howlong -= (time_spent.tv_sec*1000+time_spent.tv_usec/1000);
+}
+
+typedef struct {
+    struct timeval cur_time;
+    struct timeval start_time;
+    struct timeval wait_time;
+    struct timeval new_time;
+    struct timeval time_spent;
+    struct timeval max_wait_time;
+#ifndef USE_POLL
+    struct timeval *wait_time_ptr;
+#else
+    int poll_wait;
+#endif
+} wait_times_t, *wait_times_ptr_t;
+
+static struct timeval  zero_time = { 0 , 0};
+#ifndef USE_POLL
+static fd_set zero_fd;
+#else
+#define X_BLOCK -1
+#define X_DONT_BLOCK 0
+#endif
+
+static void InitTimes (
+    Boolean block,
+    unsigned long* howlong,
+    wait_times_ptr_t wt)
+{
+    if (block) {
+       X_GETTIMEOFDAY (&wt->cur_time);
+       FIXUP_TIMEVAL(wt->cur_time);
+       wt->start_time = wt->cur_time;
+       if(howlong == NULL) { /* special case for ever */
+#ifndef USE_POLL
+           wt->wait_time_ptr = NULL;
+#else
+           wt->poll_wait = X_BLOCK;
+#endif
+       } else { /* block until at most */
+           wt->max_wait_time.tv_sec = *howlong/1000;
+           wt->max_wait_time.tv_usec = (*howlong %1000)*1000;
+#ifndef USE_POLL
+           wt->wait_time_ptr = &wt->max_wait_time;
+#else
+           wt->poll_wait = *howlong;
+#endif
+       }
+    } else {  /* don't block */
+       wt->max_wait_time = zero_time;
+#ifndef USE_POLL
+       wt->wait_time_ptr = &wt->max_wait_time;
+#else
+       wt->poll_wait = X_DONT_BLOCK;
+#endif
+    }
+}
+
+typedef struct {
+#ifndef USE_POLL
+    fd_set rmask, wmask, emask;
+    int nfds;
+#else
+    struct pollfd* fdlist;
+    struct pollfd* stack;
+    int fdlistlen, num_dpys;
+#endif
+} wait_fds_t, *wait_fds_ptr_t;
+
+static void InitFds (
+    XtAppContext app,
+    Boolean ignoreEvents,
+    Boolean ignoreInputs,
+    wait_fds_ptr_t wf)
+{
+    int ii;
+    app->rebuild_fdlist = FALSE;
+#ifndef USE_POLL
+    wf->nfds = app->fds.nfds;
+    if( !ignoreInputs ) {
+       wf->rmask = app->fds.rmask;
+       wf->wmask = app->fds.wmask;
+       wf->emask = app->fds.emask;
+     } else
+       wf->rmask = wf->wmask = wf->emask = zero_fd;
+
+     if (!ignoreEvents)
+       for (ii = 0; ii < app->count; ii++) {
+           FD_SET (ConnectionNumber(app->list[ii]), &wf->rmask);
+       }
+#else
+#ifndef POLLRDNORM
+#define POLLRDNORM 0
+#endif
+
+#ifndef POLLRDBAND
+#define POLLRDBAND 0
+#endif
+
+#ifndef POLLWRNORM
+#define POLLWRNORM 0
+#endif
+
+#ifndef POLLWRBAND
+#define POLLWRBAND 0
+#endif
+
+#define XPOLL_READ (POLLIN|POLLRDNORM|POLLPRI|POLLRDBAND)
+#define XPOLL_WRITE (POLLOUT|POLLWRNORM|POLLWRBAND)
+#define XPOLL_EXCEPT 0
+
+    if (!ignoreEvents)
+       wf->fdlistlen = wf->num_dpys = app->count;
+    else
+       wf->fdlistlen = wf->num_dpys = 0;
+
+    if (!ignoreInputs && app->input_list != NULL) {
+       int ii;
+       for (ii = 0; ii < (int) app->input_max; ii++)
+           if (app->input_list[ii] != NULL)
+               wf->fdlistlen++;
+    }
+
+    if (!wf->fdlist || wf->fdlist == wf->stack) {
+       wf->fdlist = (struct pollfd*)
+           XtStackAlloc (sizeof (struct pollfd) * wf->fdlistlen, wf->stack);
+    } else {
+       wf->fdlist = (struct pollfd*)
+           XtRealloc ((char*) wf->fdlist,
+                      sizeof (struct pollfd) * wf->fdlistlen);
+    }
+
+    if (wf->fdlistlen) {
+       struct pollfd* fdlp = wf->fdlist;
+       InputEvent* iep;
+
+       if (!ignoreEvents)
+           for (ii = 0 ; ii < wf->num_dpys; ii++, fdlp++) {
+               fdlp->fd = ConnectionNumber (app->list[ii]);
+               fdlp->events = POLLIN;
+           }
+       if (!ignoreInputs && app->input_list != NULL)
+           for (ii = 0; ii < app->input_max; ii++)
+               if (app->input_list[ii] != NULL) {
+                   iep = app->input_list[ii];
+                   fdlp->fd = ii;
+                   fdlp->events = 0;
+                   for ( ; iep; iep = iep->ie_next) {
+                       if (iep->ie_condition & XtInputReadMask)
+                           fdlp->events |= XPOLL_READ;
+                       if (iep->ie_condition & XtInputWriteMask)
+                           fdlp->events |= XPOLL_WRITE;
+                       if (iep->ie_condition & XtInputExceptMask)
+                           fdlp->events |= XPOLL_EXCEPT;
+                   }
+                   fdlp++;
+               }
+    }
+#endif
+}
+
+static void AdjustTimes (
+    XtAppContext app,
+    Boolean block,
+    unsigned long* howlong,
+    Boolean ignoreTimers,
+    wait_times_ptr_t wt)
+{
+    if (app->timerQueue != NULL && !ignoreTimers && block) {
+       if (IS_AFTER (wt->cur_time, app->timerQueue->te_timer_value)) {
+           TIMEDELTA (wt->wait_time, app->timerQueue->te_timer_value, wt->cur_time);
+           if (howlong == NULL || IS_AFTER (wt->wait_time, wt->max_wait_time))
+#ifndef USE_POLL
+               wt->wait_time_ptr = &wt->wait_time;
+           else
+               wt->wait_time_ptr = &wt->max_wait_time;
+       } else
+           wt->wait_time_ptr = &zero_time;
+    }
+#else
+               wt->poll_wait = wt->wait_time.tv_sec * 1000 + wt->wait_time.tv_usec / 1000;
+           else
+               wt->poll_wait = wt->max_wait_time.tv_sec * 1000 + wt->max_wait_time.tv_usec / 1000;
+       } else
+           wt->poll_wait = X_DONT_BLOCK;
+    }
+#endif
+}
+
+
+static int IoWait (
+    wait_times_ptr_t wt,
+    wait_fds_ptr_t wf)
+{
+#ifndef USE_POLL
+    return Select (wf->nfds, &wf->rmask, &wf->wmask, &wf->emask,
+                  wt->wait_time_ptr);
+#else
+    return poll (wf->fdlist, wf->fdlistlen, wt->poll_wait);
+#endif
+}
+
+
+static void FindInputs (
+    XtAppContext app,
+    wait_fds_ptr_t wf,
+    int nfds,
+    Boolean ignoreEvents,
+    Boolean ignoreInputs,
+    int* dpy_no,
+    int* found_input)
+{
+    XtInputMask condition;
+    InputEvent *ep;
+    int ii;
+#ifndef USE_POLL /* { check ready file descriptors block */
+#ifdef XTHREADS
+    fd_set rmask;
+#endif
+    int dd;
+    *dpy_no = -1;
+    *found_input = False;
+
+#ifdef XTHREADS
+    rmask = app->fds.rmask;
+    for (dd = app->count; dd-- > 0; )
+       FD_SET (ConnectionNumber (app->list[dd]), &rmask);
+#endif
+
+    for (ii = 0; ii < wf->nfds && nfds > 0; ii++) {
+       condition = 0;
+       if (FD_ISSET (ii, &wf->rmask)
+#ifdef XTHREADS
+           && FD_ISSET (ii, &rmask)
+#endif
+       ) {
+           nfds--;
+           if (!ignoreEvents) {
+               for (dd = 0; dd < app->count; dd++) {
+                   if (ii == ConnectionNumber (app->list[dd])) {
+                       if (*dpy_no == -1) {
+                           if (XEventsQueued (app->list[dd], QueuedAfterReading ))
+                               *dpy_no = dd;
+                               /*
+                                * An error event could have arrived
+                                * without any real events, or events
+                                * could have been swallowed by Xlib,
+                                * or the connection may be broken.
+                                * We can't tell the difference, so
+                                * assume Xlib will eventually discover
+                                * a broken connection.
+                                */
+                       }
+                       goto ENDILOOP;
+                   }
+               }
+           }
+           condition = XtInputReadMask;
+       }
+       if (FD_ISSET (ii, &wf->wmask)
+#ifdef XTHREADS
+           && FD_ISSET (ii, &app->fds.wmask)
+#endif
+       ) {
+           condition |= XtInputWriteMask;
+           nfds--;
+       }
+       if (FD_ISSET (ii, &wf->emask)
+#ifdef XTHREADS
+           && FD_ISSET (ii, &app->fds.emask)
+#endif
+       ) {
+           condition |= XtInputExceptMask;
+           nfds--;
+       }
+       if (condition) {
+           for (ep = app->input_list[ii]; ep; ep = ep->ie_next)
+               if (condition & ep->ie_condition) {
+                   /* make sure this input isn't already marked outstanding */
+                   InputEvent  *oq;
+                   for (oq = app->outstandingQueue; oq; oq = oq->ie_oq)
+                       if (oq == ep)
+                           break;
+                   if (!oq)
+                   {
+                       ep->ie_oq = app->outstandingQueue;
+                       app->outstandingQueue = ep;
+                   }
+               }
+           *found_input = True;
+       }
+ENDILOOP:   ;
+    } /* endfor */
+#else /* }{ */
+    struct pollfd* fdlp;
+
+    *dpy_no = -1;
+    *found_input = False;
+
+    if (!ignoreEvents) {
+       fdlp = wf->fdlist;
+       for (ii = 0; ii < wf->num_dpys; ii++, fdlp++) {
+           if (*dpy_no == -1 && fdlp->revents & (POLLIN|POLLHUP|POLLERR) &&
+#ifdef XTHREADS
+               !(fdlp->revents & POLLNVAL) &&
+#endif
+               XEventsQueued (app->list[ii], QueuedAfterReading)) {
+               *dpy_no = ii;
+               break;
+           }
+       }
+    }
+
+    if (!ignoreInputs) {
+       fdlp = &wf->fdlist[wf->num_dpys];
+       for (ii = wf->num_dpys; ii < wf->fdlistlen; ii++, fdlp++) {
+           condition = 0;
+           if (fdlp->revents) {
+               if (fdlp->revents & (XPOLL_READ|POLLHUP|POLLERR)
+#ifdef XTHREADS
+                   && !(fdlp->revents & POLLNVAL)
+#endif
+               )
+                   condition = XtInputReadMask;
+               if (fdlp->revents & XPOLL_WRITE)
+                   condition |= XtInputWriteMask;
+               if (fdlp->revents & XPOLL_EXCEPT)
+                   condition |= XtInputExceptMask;
+           }
+           if (condition) {
+               *found_input = True;
+               for (ep = app->input_list[fdlp->fd]; ep; ep = ep->ie_next)
+                   if (condition & ep->ie_condition) {
+                       InputEvent      *oq;
+                       /* make sure this input isn't already marked outstanding */
+                       for (oq = app->outstandingQueue; oq; oq = oq->ie_oq)
+                           if (oq == ep)
+                               break;
+                       if (!oq)
+                       {
+                           ep->ie_oq = app->outstandingQueue;
+                           app->outstandingQueue = ep;
+                       }
+                   }
+           }
+       }
+    }
+#endif /* } */
+}
+
+/*
+ * Routine to block in the toolkit.  This should be the only call to select.
+ *
+ * This routine returns when there is something to be done.
+ *
+ * Before calling this with ignoreInputs==False, app->outstandingQueue should
+ * be checked; this routine will not verify that an alternate input source
+ * has not already been enqueued.
+ *
+ *
+ * _XtWaitForSomething( appContext,
+ *                      ignoreEvent, ignoreTimers, ignoreInputs, ignoreSignals,
+ *                     block, drop_lock, howlong)
+ * XtAppContext app;        (Displays to check wait on)
+ *
+ * Boolean ignoreEvents;     (Don't return if XEvents are available
+ *                              Also implies forget XEvents exist)
+ *
+ * Boolean ignoreTimers;     (Ditto for timers)
+ *
+ * Boolean ignoreInputs;     (Ditto for input callbacks )
+ *
+ * Boolean ignoreSignals;    (Ditto for signals)
+ *
+ * Boolean block;           (Okay to block)
+ *
+ * Boolean drop_lock         (drop lock before going into select/poll)
+ *
+ * TimeVal howlong;         (howlong to wait for if blocking and not
+ *                             doing Timers... Null means forever.
+ *                             Maybe should mean shortest of both)
+ * Returns display for which input is available, if any
+ * and if ignoreEvents==False, else returns -1
+ *
+ * if ignoring everything && block=True && howlong=NULL, you'll have
+ * lots of time for coffee; better not try it!  In fact, it probably
+ * makes little sense to do this regardless of the value of howlong
+ * (bottom line is, we don't bother checking here).
+ *
+ * If drop_lock is FALSE, the app->lock->mutex is not unlocked before
+ * entering select/poll. It is illegal for drop_lock to be FALSE if
+ * ignoreTimers, ignoreInputs, or ignoreSignals is FALSE.
+ */
+int _XtWaitForSomething(
+    XtAppContext app,
+    _XtBoolean ignoreEvents,
+    _XtBoolean ignoreTimers,
+    _XtBoolean ignoreInputs,
+    _XtBoolean ignoreSignals,
+    _XtBoolean block,
+#ifdef XTHREADS
+    _XtBoolean drop_lock,
+#endif
+    unsigned long *howlong)
+{
+    wait_times_t wt;
+    wait_fds_t wf;
+    int nfds, dpy_no, found_input, dd;
+#ifdef XTHREADS
+    Boolean push_thread = TRUE;
+    Boolean pushed_thread = FALSE;
+    int level = 0;
+#endif
+#ifdef USE_POLL
+    struct pollfd fdlist[XT_DEFAULT_FDLIST_SIZE];
+#endif
+
+#ifdef XTHREADS
+    /* assert ((ignoreTimers && ignoreInputs && ignoreSignals) || drop_lock); */
+    /* If not multi-threaded, never drop lock */
+    if (app->lock == (ThreadAppProc) NULL)
+       drop_lock = FALSE;
+#endif
+
+    InitTimes (block, howlong, &wt);
+
+#ifdef USE_POLL
+    wf.fdlist = NULL;
+    wf.stack = fdlist;
+    wf.fdlistlen = wf.num_dpys = 0;
+#endif
+
+WaitLoop:
+    app->rebuild_fdlist = TRUE;
+
+    while (1) {
+       AdjustTimes (app, block, howlong, ignoreTimers, &wt);
+
+       if (block && app->block_hook_list) {
+           BlockHook hook;
+           for (hook = app->block_hook_list;
+                hook != NULL;
+                hook = hook->next)
+               (*hook->proc) (hook->closure);
+
+           if (!ignoreEvents)
+               /* see if the hook(s) generated any protocol */
+               for (dd = 0; dd < app->count; dd++)
+                   if (XEventsQueued(app->list[dd], QueuedAlready)) {
+#ifdef USE_POLL
+                       XtStackFree ((XtPointer) wf.fdlist, fdlist);
+#endif
+                       return dd;
+                   }
+       }
+
+       if (app->rebuild_fdlist)
+           InitFds (app, ignoreEvents, ignoreInputs, &wf);
+
+#ifdef XTHREADS /* { */
+       if (drop_lock) {
+           YIELD_APP_LOCK(app, &push_thread, &pushed_thread, &level);
+           nfds = IoWait (&wt, &wf);
+           RESTORE_APP_LOCK(app, level, &pushed_thread);
+       } else
+#endif /* } */
+       nfds = IoWait (&wt, &wf);
+       if (nfds == -1) {
+           /*
+            *  interrupt occured recalculate time value and wait again.
+            */
+           if (errno == EINTR || errno == EAGAIN) {
+               if (errno == EAGAIN) {
+                   errno = 0;  /* errno is not self reseting */
+                   continue;
+               }
+               errno = 0;  /* errno is not self reseting */
+
+               /* was it interrupted by a signal that we care about? */
+               if (!ignoreSignals && app->signalQueue != NULL) {
+                   SignalEventRec *se_ptr = app->signalQueue;
+                   while (se_ptr != NULL) {
+                       if (se_ptr->se_notice) {
+                           if (block && howlong != NULL)
+                               AdjustHowLong (howlong, &wt.start_time);
+#ifdef USE_POLL
+                           XtStackFree ((XtPointer) wf.fdlist, fdlist);
+#endif
+                           return -1;
+                       }
+                       se_ptr = se_ptr->se_next;
+                   }
+               }
+
+               if (!ignoreEvents)
+                   /* get Xlib to detect a bad connection */
+                   for (dd = 0; dd < app->count; dd++)
+                       if (XEventsQueued(app->list[dd], QueuedAfterReading)) {
+#ifdef USE_POLL
+                           XtStackFree ((XtPointer) wf.fdlist, fdlist);
+#endif
+                           return dd;
+                       }
+
+               if (block) {
+#ifndef USE_POLL
+                   if (wt.wait_time_ptr == NULL)
+#else
+                   if (wt.poll_wait == X_BLOCK)
+#endif
+                       continue;
+                   X_GETTIMEOFDAY (&wt.new_time);
+                   FIXUP_TIMEVAL (wt.new_time);
+                   TIMEDELTA (wt.time_spent, wt.new_time, wt.cur_time);
+                   wt.cur_time = wt.new_time;
+#ifndef USE_POLL
+                   if (IS_AFTER (wt.time_spent, *wt.wait_time_ptr)) {
+                       TIMEDELTA (wt.wait_time, *wt.wait_time_ptr, wt.time_spent);
+                       wt.wait_time_ptr = &wt.wait_time;
+                       continue;
+                   } else
+#else
+                   if ((wt.time_spent.tv_sec * 1000 + wt.time_spent.tv_usec / 1000) < wt.poll_wait) {
+                       wt.poll_wait -= (wt.time_spent.tv_sec * 1000 + wt.time_spent.tv_usec / 1000);
+                       continue;
+                   } else
+#endif
+                       nfds = 0;
+               }
+           } else {
+               char Errno[12];
+               String param = Errno;
+               Cardinal param_count = 1;
+
+               sprintf( Errno, "%d", errno);
+               XtAppWarningMsg(app, "communicationError","select",
+                       XtCXtToolkitError,"Select failed; error code %s",
+                       &param, &param_count);
+               continue;
+           }
+       } /* timed out or input available */
+       break;
+    }
+
+    if (nfds == 0) {
+       /* Timed out */
+       if (howlong)
+           *howlong = (unsigned long)0;
+#ifdef USE_POLL
+       XtStackFree ((XtPointer) wf.fdlist, fdlist);
+#endif
+       return -1;
+    }
+
+    if (block && howlong != NULL)
+       AdjustHowLong (howlong, &wt.start_time);
+
+    if (ignoreInputs && ignoreEvents) {
+#ifdef USE_POLL
+       XtStackFree ((XtPointer) wf.fdlist, fdlist);
+#endif
+       return -1;
+    } else
+       FindInputs (app, &wf, nfds,
+                   ignoreEvents, ignoreInputs,
+                   &dpy_no, &found_input);
+
+    if (dpy_no >= 0 || found_input) {
+#ifdef USE_POLL
+       XtStackFree ((XtPointer) wf.fdlist, fdlist);
+#endif
+       return dpy_no;
+    }
+    if (block)
+        goto WaitLoop;
+    else {
+#ifdef USE_POLL
+       XtStackFree ((XtPointer) wf.fdlist, fdlist);
+#endif
+        return -1;
+    }
+}
+
+#define IeCallProc(ptr) \
+    (*ptr->ie_proc) (ptr->ie_closure, &ptr->ie_source, (XtInputId*)&ptr);
+
+#define TeCallProc(ptr) \
+    (*ptr->te_proc) (ptr->te_closure, (XtIntervalId*)&ptr);
+
+#define SeCallProc(ptr) \
+    (*ptr->se_proc) (ptr->se_closure, (XtSignalId*)&ptr);
+
+/*
+ * Public Routines
+ */
+
+XtIntervalId XtAddTimeOut(
+       unsigned long interval,
+       XtTimerCallbackProc proc,
+       XtPointer closure)
+{
+       return XtAppAddTimeOut(_XtDefaultAppContext(),
+               interval, proc, closure);
+}
+
+static void QueueTimerEvent(
+    XtAppContext app,
+    TimerEventRec *ptr)
+{
+        TimerEventRec *t,**tt;
+        tt = &app->timerQueue;
+        t  = *tt;
+        while (t != NULL &&
+                IS_AFTER(t->te_timer_value, ptr->te_timer_value)) {
+          tt = &t->te_next;
+          t  = *tt;
+         }
+         ptr->te_next = t;
+         *tt = ptr;
+}
+
+XtIntervalId XtAppAddTimeOut(
+       XtAppContext app,
+       unsigned long interval,
+       XtTimerCallbackProc proc,
+       XtPointer closure)
+{
+       TimerEventRec *tptr;
+       struct timeval current_time;
+
+       LOCK_APP(app);
+       LOCK_PROCESS;
+       if (freeTimerRecs) {
+           tptr = freeTimerRecs;
+           freeTimerRecs = tptr->te_next;
+       }
+       else tptr = XtNew(TimerEventRec);
+       UNLOCK_PROCESS;
+
+       tptr->te_next = NULL;
+       tptr->te_closure = closure;
+       tptr->te_proc = proc;
+       tptr->app = app;
+       tptr->te_timer_value.tv_sec = interval/1000;
+       tptr->te_timer_value.tv_usec = (interval%1000)*1000;
+        X_GETTIMEOFDAY (&current_time);
+       FIXUP_TIMEVAL(current_time);
+        ADD_TIME(tptr->te_timer_value,tptr->te_timer_value,current_time);
+       QueueTimerEvent(app, tptr);
+       UNLOCK_APP(app);
+       return( (XtIntervalId) tptr);
+}
+
+void  XtRemoveTimeOut(
+       XtIntervalId id)
+{
+       TimerEventRec *t, *last, *tid = (TimerEventRec *) id;
+       XtAppContext app = tid->app;
+
+       /* find it */
+       LOCK_APP(app);
+       for(t = app->timerQueue, last = NULL;
+           t != NULL && t != tid;
+           t = t->te_next) last = t;
+
+       if (t == NULL) {
+           UNLOCK_APP(app);
+           return; /* couldn't find it */
+       }
+       if(last == NULL) { /* first one on the list */
+           app->timerQueue = t->te_next;
+       } else last->te_next = t->te_next;
+
+       LOCK_PROCESS;
+       t->te_next = freeTimerRecs;
+       freeTimerRecs = t;
+       UNLOCK_PROCESS;
+       UNLOCK_APP(app);
+}
+
+XtWorkProcId XtAddWorkProc(
+       XtWorkProc proc,
+       XtPointer closure)
+{
+       return XtAppAddWorkProc(_XtDefaultAppContext(), proc, closure);
+}
+
+XtWorkProcId XtAppAddWorkProc(
+       XtAppContext app,
+       XtWorkProc proc,
+       XtPointer closure)
+{
+       WorkProcRec *wptr;
+
+       LOCK_APP(app);
+       LOCK_PROCESS;
+       if (freeWorkRecs) {
+           wptr = freeWorkRecs;
+           freeWorkRecs = wptr->next;
+       } else wptr = XtNew(WorkProcRec);
+       UNLOCK_PROCESS;
+       wptr->next = app->workQueue;
+       wptr->closure = closure;
+       wptr->proc = proc;
+       wptr->app = app;
+       app->workQueue = wptr;
+       UNLOCK_APP(app);
+       return (XtWorkProcId) wptr;
+}
+
+void  XtRemoveWorkProc(
+       XtWorkProcId id)
+{
+       WorkProcRec *wid= (WorkProcRec *) id, *w, *last;
+       XtAppContext app = wid->app;
+
+       LOCK_APP(app);
+       /* find it */
+       for(w = app->workQueue, last = NULL;
+           w != NULL && w != wid; w = w->next) last = w;
+
+       if (w == NULL) {
+           UNLOCK_APP(app);
+           return; /* couldn't find it */
+       }
+
+       if(last == NULL) app->workQueue = w->next;
+       else last->next = w->next;
+       LOCK_PROCESS;
+       w->next = freeWorkRecs;
+       freeWorkRecs = w;
+       UNLOCK_PROCESS;
+       UNLOCK_APP(app);
+}
+
+XtSignalId XtAddSignal(
+       XtSignalCallbackProc proc,
+       XtPointer closure)
+{
+       return XtAppAddSignal(_XtDefaultAppContext(), proc, closure);
+}
+
+XtSignalId XtAppAddSignal(
+       XtAppContext app,
+       XtSignalCallbackProc proc,
+       XtPointer closure)
+{
+       SignalEventRec *sptr;
+
+       LOCK_APP(app);
+       LOCK_PROCESS;
+       if (freeSignalRecs) {
+           sptr = freeSignalRecs;
+           freeSignalRecs = sptr->se_next;
+       } else
+           sptr = XtNew(SignalEventRec);
+       UNLOCK_PROCESS;
+       sptr->se_next = app->signalQueue;
+       sptr->se_closure = closure;
+       sptr->se_proc = proc;
+       sptr->app = app;
+       sptr->se_notice = FALSE;
+       app->signalQueue = sptr;
+       UNLOCK_APP(app);
+       return (XtSignalId) sptr;
+}
+
+void XtRemoveSignal(
+       XtSignalId id)
+{
+       SignalEventRec *sid = (SignalEventRec*) id, *s, *last = NULL;
+       XtAppContext app = sid->app;
+
+       LOCK_APP(app);
+       for (s = app->signalQueue; s != NULL && s != sid; s = s->se_next)
+           last = s;
+       if (s == NULL) {
+           UNLOCK_APP(app);
+           return;
+       }
+       if (last == NULL)
+           app->signalQueue = s->se_next;
+       else
+           last->se_next = s->se_next;
+       LOCK_PROCESS;
+       s->se_next = freeSignalRecs;
+       freeSignalRecs = s;
+       UNLOCK_PROCESS;
+       UNLOCK_APP(app);
+}
+
+void XtNoticeSignal(
+       XtSignalId id)
+{
+       /*
+        * It would be overkill to lock the app to set this flag.
+        * In the worst case, 2..n threads would be modifying this
+        * flag. The last one wins. Since signals occur asynchronously
+        * anyway, this can occur with or without threads.
+        *
+        * The other issue is that thread t1 sets the flag in a
+        * signalrec that has been deleted in thread t2. We rely
+        * on a detail of the implementation, i.e. free'd signalrecs
+        * aren't really free'd, they're just moved to a list of
+        * free recs, so deref'ing one won't hurt anything.
+        *
+        * Lastly, and perhaps most importantly, since POSIX threads
+        * says that the handling of asynchronous signals in a synchronous
+        * threads environment is undefined. Therefor it would be an
+        * error for both signals and threads to be in use in the same
+        * program.
+        */
+       SignalEventRec *sid = (SignalEventRec*) id;
+       sid->se_notice = TRUE;
+}
+
+XtInputId XtAddInput(
+       int source,
+       XtPointer Condition,
+       XtInputCallbackProc proc,
+       XtPointer closure)
+{
+       return XtAppAddInput(_XtDefaultAppContext(),
+               source, Condition, proc, closure);
+}
+
+XtInputId XtAppAddInput(
+       XtAppContext app,
+       int source,
+       XtPointer Condition,
+       XtInputCallbackProc proc,
+       XtPointer closure)
+{
+       InputEvent* sptr;
+       XtInputMask condition = (XtInputMask) Condition;
+
+       LOCK_APP(app);
+       if (!condition ||
+           condition & ~(XtInputReadMask|XtInputWriteMask|XtInputExceptMask))
+           XtAppErrorMsg(app,"invalidParameter","xtAddInput",XtCXtToolkitError,
+                         "invalid condition passed to XtAppAddInput",
+                         (String *)NULL, (Cardinal *)NULL);
+
+       if (app->input_max <= source) {
+           Cardinal n = source + 1;
+           int ii;
+           app->input_list = (InputEvent**)XtRealloc((char*) app->input_list,
+                                                     n * sizeof(InputEvent*));
+           for (ii = app->input_max; ii < (int) n; ii++)
+               app->input_list[ii] = (InputEvent*) NULL;
+           app->input_max = n;
+       }
+       sptr = XtNew(InputEvent);
+       sptr->ie_proc = proc;
+       sptr->ie_closure = closure;
+       sptr->app = app;
+       sptr->ie_oq = NULL;
+       sptr->ie_source = source;
+       sptr->ie_condition = condition;
+       sptr->ie_next = app->input_list[source];
+       app->input_list[source] = sptr;
+
+#ifndef USE_POLL
+       if (condition & XtInputReadMask)   FD_SET(source, &app->fds.rmask);
+       if (condition & XtInputWriteMask)  FD_SET(source, &app->fds.wmask);
+       if (condition & XtInputExceptMask) FD_SET(source, &app->fds.emask);
+
+       if (app->fds.nfds < (source+1)) app->fds.nfds = source+1;
+#else
+       if (sptr->ie_next == NULL)
+           app->fds.nfds++;
+#endif
+       app->input_count++;
+       app->rebuild_fdlist = TRUE;
+       UNLOCK_APP(app);
+       return((XtInputId)sptr);
+}
+
+void XtRemoveInput(
+       register XtInputId  id)
+{
+       register InputEvent *sptr, *lptr;
+       XtAppContext app = ((InputEvent *)id)->app;
+       register int source = ((InputEvent *)id)->ie_source;
+       Boolean found = False;
+
+       LOCK_APP(app);
+       sptr = app->outstandingQueue;
+       lptr = NULL;
+       for (; sptr != NULL; sptr = sptr->ie_oq) {
+           if (sptr == (InputEvent *)id) {
+               if (lptr == NULL) app->outstandingQueue = sptr->ie_oq;
+               else lptr->ie_oq = sptr->ie_oq;
+           }
+           lptr = sptr;
+       }
+
+       if(app->input_list && (sptr = app->input_list[source]) != NULL) {
+               for( lptr = NULL ; sptr; sptr = sptr->ie_next ){
+                       if(sptr == (InputEvent *) id) {
+#ifndef USE_POLL
+                               XtInputMask condition = 0;
+#endif
+                               if(lptr == NULL) {
+                                   app->input_list[source] = sptr->ie_next;
+                               } else {
+                                   lptr->ie_next = sptr->ie_next;
+                               }
+#ifndef USE_POLL
+                               for (lptr = app->input_list[source];
+                                    lptr; lptr = lptr->ie_next)
+                                   condition |= lptr->ie_condition;
+                               if ((sptr->ie_condition & XtInputReadMask) &&
+                                   !(condition & XtInputReadMask))
+                                  FD_CLR(source, &app->fds.rmask);
+                               if ((sptr->ie_condition & XtInputWriteMask) &&
+                                   !(condition & XtInputWriteMask))
+                                  FD_CLR(source, &app->fds.wmask);
+                               if ((sptr->ie_condition & XtInputExceptMask) &&
+                                   !(condition & XtInputExceptMask))
+                                  FD_CLR(source, &app->fds.emask);
+#endif
+                               XtFree((char *) sptr);
+                               found = True;
+                               break;
+                       }
+                       lptr = sptr;
+               }
+       }
+
+       if (found) {
+           app->input_count--;
+#ifdef USE_POLL
+           if (app->input_list[source] == NULL)
+               app->fds.nfds--;
+#endif
+           app->rebuild_fdlist = TRUE;
+       } else
+           XtAppWarningMsg(app, "invalidProcedure","inputHandler",
+                           XtCXtToolkitError,
+                           "XtRemoveInput: Input handler not found",
+                           (String *)NULL, (Cardinal *)NULL);
+       UNLOCK_APP(app);
+}
+
+void _XtRemoveAllInputs(
+    XtAppContext app)
+{
+    int i;
+    for (i = 0; i < app->input_max; i++) {
+       InputEvent* ep = app->input_list[i];
+       while (ep) {
+           InputEvent *next = ep->ie_next;
+           XtFree( (char*)ep );
+           ep = next;
+       }
+    }
+    XtFree((char *) app->input_list);
+}
+
+/* Do alternate input and timer callbacks if there are any */
+
+static void DoOtherSources(
+       XtAppContext app)
+{
+       TimerEventRec *te_ptr;
+       InputEvent *ie_ptr;
+       struct timeval  cur_time;
+
+#define DrainQueue() \
+       for (ie_ptr = app->outstandingQueue; ie_ptr != NULL;) { \
+           app->outstandingQueue = ie_ptr->ie_oq;              \
+           ie_ptr ->ie_oq = NULL;                              \
+           IeCallProc(ie_ptr);                                 \
+           ie_ptr = app->outstandingQueue;                     \
+       }
+/*enddef*/
+       DrainQueue();
+       if (app->input_count > 0) {
+           /* Call _XtWaitForSomething to get input queued up */
+           (void) _XtWaitForSomething (app,
+                                       TRUE, TRUE, FALSE, TRUE,
+                                       FALSE,
+#ifdef XTHREADS
+                                       TRUE,
+#endif
+                                       (unsigned long *)NULL);
+           DrainQueue();
+       }
+       if (app->timerQueue != NULL) {  /* check timeout queue */
+           X_GETTIMEOFDAY (&cur_time);
+           FIXUP_TIMEVAL(cur_time);
+           while(IS_AT_OR_AFTER (app->timerQueue->te_timer_value, cur_time)) {
+               te_ptr = app->timerQueue;
+               app->timerQueue = te_ptr->te_next;
+               te_ptr->te_next = NULL;
+               if (te_ptr->te_proc != NULL)
+                   TeCallProc(te_ptr);
+               LOCK_PROCESS;
+               te_ptr->te_next = freeTimerRecs;
+               freeTimerRecs = te_ptr;
+               UNLOCK_PROCESS;
+               if (app->timerQueue == NULL) break;
+           }
+       }
+       if (app->signalQueue != NULL) {
+           SignalEventRec *se_ptr = app->signalQueue;
+           while (se_ptr != NULL) {
+               if (se_ptr->se_notice) {
+                   se_ptr->se_notice = FALSE;
+                   if (se_ptr->se_proc != NULL)
+                       SeCallProc(se_ptr);
+               }
+               se_ptr = se_ptr->se_next;
+           }
+       }
+#undef DrainQueue
+}
+
+/* If there are any work procs, call them.  Return whether we did so */
+
+static Boolean CallWorkProc(
+       XtAppContext app)
+{
+       register WorkProcRec *w = app->workQueue;
+       Boolean delete;
+
+       if (w == NULL) return FALSE;
+
+       app->workQueue = w->next;
+
+       delete = (*(w->proc)) (w->closure);
+
+       if (delete) {
+           LOCK_PROCESS;
+           w->next = freeWorkRecs;
+           freeWorkRecs = w;
+           UNLOCK_PROCESS;
+       }
+       else {
+           w->next = app->workQueue;
+           app->workQueue = w;
+       }
+       return TRUE;
+}
+
+/*
+ * XtNextEvent()
+ * return next event;
+ */
+
+void XtNextEvent(
+       XEvent *event)
+{
+       XtAppNextEvent(_XtDefaultAppContext(), event);
+}
+
+void _XtRefreshMapping(
+    XEvent* event,
+    _XtBoolean dispatch)
+{
+    XtPerDisplay pd;
+
+    LOCK_PROCESS;
+    pd = _XtGetPerDisplay(event->xmapping.display);
+    if (event->xmapping.request != MappingPointer &&
+       pd && pd->keysyms && (event->xmapping.serial >= pd->keysyms_serial))
+       _XtBuildKeysymTables( event->xmapping.display, pd );
+    XRefreshKeyboardMapping(&event->xmapping);
+    if (dispatch && pd && pd->mapping_callbacks)
+       XtCallCallbackList((Widget) NULL,
+                          (XtCallbackList)pd->mapping_callbacks,
+                          (XtPointer)event );
+    UNLOCK_PROCESS;
+}
+
+void XtAppNextEvent(
+       XtAppContext app,
+       XEvent *event)
+{
+    int i, d;
+
+    LOCK_APP(app);
+    for (;;) {
+       if (app->count == 0)
+           DoOtherSources(app);
+       else {
+           for (i = 1; i <= app->count; i++) {
+               d = (i + app->last) % app->count;
+               if (d == 0) DoOtherSources(app);
+               if (XEventsQueued(app->list[d], QueuedAfterReading))
+                   goto GotEvent;
+           }
+           for (i = 1; i <= app->count; i++) {
+               d = (i + app->last) % app->count;
+               if (XEventsQueued(app->list[d], QueuedAfterFlush))
+                   goto GotEvent;
+           }
+       }
+
+       /* We're ready to wait...if there is a work proc, call it */
+       if (CallWorkProc(app)) continue;
+
+       d = _XtWaitForSomething (app,
+                                FALSE, FALSE, FALSE, FALSE,
+                                TRUE,
+#ifdef XTHREADS
+                                TRUE,
+#endif
+                                (unsigned long *) NULL);
+
+       if (d != -1) {
+         GotEvent:
+           XNextEvent (app->list[d], event);
+#ifdef XTHREADS
+           /* assert(app->list[d] == event->xany.display); */
+#endif
+           app->last = d;
+           if (event->xany.type == MappingNotify)
+               _XtRefreshMapping(event, False);
+           UNLOCK_APP(app);
+           return;
+       }
+
+    } /* for */
+}
+
+void XtProcessEvent(
+       XtInputMask mask)
+{
+       XtAppProcessEvent(_XtDefaultAppContext(), mask);
+}
+
+void XtAppProcessEvent(
+       XtAppContext app,
+       XtInputMask mask)
+{
+       int i, d;
+       XEvent event;
+       struct timeval cur_time;
+
+       LOCK_APP(app);
+       if (mask == 0) {
+           UNLOCK_APP(app);
+           return;
+       }
+
+       for (;;) {
+
+           if (mask & XtIMSignal && app->signalQueue != NULL) {
+               SignalEventRec *se_ptr = app->signalQueue;
+               while (se_ptr != NULL) {
+                   if (se_ptr->se_notice) {
+                       se_ptr->se_notice = FALSE;
+                       SeCallProc(se_ptr);
+                       UNLOCK_APP(app);
+                       return;
+                   }
+                   se_ptr = se_ptr->se_next;
+               }
+           }
+
+           if (mask & XtIMTimer && app->timerQueue != NULL) {
+               X_GETTIMEOFDAY (&cur_time);
+               FIXUP_TIMEVAL(cur_time);
+               if (IS_AT_OR_AFTER(app->timerQueue->te_timer_value, cur_time)){
+                   TimerEventRec *te_ptr = app->timerQueue;
+                   app->timerQueue = app->timerQueue->te_next;
+                   te_ptr->te_next = NULL;
+                    if (te_ptr->te_proc != NULL)
+                       TeCallProc(te_ptr);
+                   LOCK_PROCESS;
+                   te_ptr->te_next = freeTimerRecs;
+                   freeTimerRecs = te_ptr;
+                   UNLOCK_PROCESS;
+                   UNLOCK_APP(app);
+                   return;
+               }
+           }
+
+           if (mask & XtIMAlternateInput) {
+               if (app->input_count > 0 && app->outstandingQueue == NULL) {
+                   /* Call _XtWaitForSomething to get input queued up */
+                   (void) _XtWaitForSomething (app,
+                                               TRUE, TRUE, FALSE, TRUE,
+                                               FALSE,
+#ifdef XTHREADS
+                                               TRUE,
+#endif
+                                               (unsigned long *)NULL);
+               }
+               if (app->outstandingQueue != NULL) {
+                   InputEvent *ie_ptr = app->outstandingQueue;
+                   app->outstandingQueue = ie_ptr->ie_oq;
+                   ie_ptr->ie_oq = NULL;
+                   IeCallProc(ie_ptr);
+                   UNLOCK_APP(app);
+                   return;
+               }
+           }
+
+           if (mask & XtIMXEvent) {
+               for (i = 1; i <= app->count; i++) {
+                   d = (i + app->last) % app->count;
+                   if (XEventsQueued(app->list[d], QueuedAfterReading))
+                       goto GotEvent;
+               }
+               for (i = 1; i <= app->count; i++) {
+                   d = (i + app->last) % app->count;
+                   if (XEventsQueued(app->list[d], QueuedAfterFlush))
+                       goto GotEvent;
+               }
+           }
+
+           /* Nothing to do...wait for something */
+
+           if (CallWorkProc(app)) continue;
+
+           d = _XtWaitForSomething (app,
+                                   (mask & XtIMXEvent ? FALSE : TRUE),
+                                   (mask & XtIMTimer ? FALSE : TRUE),
+                                   (mask & XtIMAlternateInput ? FALSE : TRUE),
+                                   (mask & XtIMSignal ? FALSE : TRUE),
+                                   TRUE,
+#ifdef XTHREADS
+                                   TRUE,
+#endif
+                                   (unsigned long *) NULL);
+
+           if (mask & XtIMXEvent && d != -1) {
+             GotEvent:
+               XNextEvent(app->list[d], &event);
+#ifdef XTHREADS
+               /* assert(app->list[d] == event.xany.display); */
+#endif
+               app->last = d;
+               if (event.xany.type == MappingNotify) {
+                   _XtRefreshMapping(&event, False);
+               }
+               XtDispatchEvent(&event);
+               UNLOCK_APP(app);
+               return;
+           }
+
+       }
+}
+
+Boolean XtPending(void)
+{
+       return (XtAppPending(_XtDefaultAppContext()) != 0);
+}
+
+XtInputMask XtAppPending(
+       XtAppContext app)
+{
+       struct timeval cur_time;
+       int d;
+       XtInputMask ret = 0;
+
+/*
+ * Check for pending X events
+ */
+       LOCK_APP(app);
+       for (d = 0; d < app->count; d++) {
+           if (XEventsQueued(app->list[d], QueuedAfterReading)) {
+               ret = XtIMXEvent;
+               break;
+           }
+       }
+       if (ret == 0) {
+           for (d = 0; d < app->count; d++) {
+               if (XEventsQueued(app->list[d], QueuedAfterFlush)) {
+                   ret = XtIMXEvent;
+                   break;
+               }
+           }
+       }
+
+       if (app->signalQueue != NULL) {
+           SignalEventRec *se_ptr = app->signalQueue;
+           while (se_ptr != NULL) {
+               if (se_ptr->se_notice) {
+                   ret |= XtIMSignal;
+                   break;
+               }
+               se_ptr = se_ptr->se_next;
+           }
+       }
+
+/*
+ * Check for pending alternate input
+ */
+       if (app->timerQueue != NULL) {  /* check timeout queue */
+           X_GETTIMEOFDAY (&cur_time);
+           FIXUP_TIMEVAL(cur_time);
+           if ((IS_AT_OR_AFTER(app->timerQueue->te_timer_value, cur_time))  &&
+                (app->timerQueue->te_proc != NULL)) {
+               ret |= XtIMTimer;
+           }
+       }
+
+       if (app->outstandingQueue != NULL) ret |= XtIMAlternateInput;
+       else {
+           /* This won't cause a wait, but will enqueue any input */
+
+           if(_XtWaitForSomething (app,
+                                   FALSE, TRUE, FALSE, TRUE,
+                                   FALSE,
+#ifdef XTHREADS
+                                   TRUE,
+#endif
+                                   (unsigned long *) NULL) != -1)
+               ret |= XtIMXEvent;
+           if (app->outstandingQueue != NULL) ret |= XtIMAlternateInput;
+       }
+       UNLOCK_APP(app);
+       return ret;
+}
+
+/* Peek at alternate input and timer callbacks if there are any */
+
+static Boolean PeekOtherSources(
+       XtAppContext app)
+{
+       struct timeval  cur_time;
+
+       if (app->outstandingQueue != NULL) return TRUE;
+
+       if (app->signalQueue != NULL) {
+           SignalEventRec *se_ptr = app->signalQueue;
+           while (se_ptr != NULL) {
+               if (se_ptr->se_notice)
+                   return TRUE;
+               se_ptr = se_ptr->se_next;
+           }
+       }
+
+       if (app->input_count > 0) {
+           /* Call _XtWaitForSomething to get input queued up */
+           (void) _XtWaitForSomething (app,
+                                       TRUE, TRUE, FALSE, TRUE,
+                                       FALSE,
+#ifdef XTHREADS
+                                       TRUE,
+#endif
+                                       (unsigned long *)NULL);
+           if (app->outstandingQueue != NULL) return TRUE;
+       }
+
+       if (app->timerQueue != NULL) {  /* check timeout queue */
+           X_GETTIMEOFDAY (&cur_time);
+           FIXUP_TIMEVAL(cur_time);
+           if (IS_AT_OR_AFTER (app->timerQueue->te_timer_value, cur_time))
+               return TRUE;
+       }
+
+       return FALSE;
+}
+
+Boolean XtPeekEvent(
+       XEvent *event)
+{
+       return XtAppPeekEvent(_XtDefaultAppContext(), event);
+}
+
+Boolean XtAppPeekEvent_SkipTimer;
+
+Boolean XtAppPeekEvent(
+       XtAppContext app,
+       XEvent *event)
+{
+       int i, d;
+       Boolean foundCall = FALSE;
+
+       LOCK_APP(app);
+       for (i = 1; i <= app->count; i++) {
+           d = (i + app->last) % app->count;
+           if (d == 0) foundCall = PeekOtherSources(app);
+           if (XEventsQueued(app->list[d], QueuedAfterReading))
+               goto GotEvent;
+       }
+       for (i = 1; i <= app->count; i++) {
+           d = (i + app->last) % app->count;
+           if (XEventsQueued(app->list[d], QueuedAfterFlush))
+               goto GotEvent;
+       }
+
+       if (foundCall) {
+           event->xany.type = 0;
+           event->xany.display = NULL;
+           event->xany.window = 0;
+           UNLOCK_APP(app);
+           return FALSE;
+       }
+
+       while (1) {
+               d = _XtWaitForSomething (app,
+                       FALSE, FALSE, FALSE, FALSE,
+                       TRUE,
+#ifdef XTHREADS
+                       TRUE,
+#endif
+                       (unsigned long *) NULL);
+
+               if (d != -1) {  /* event */
+                       GotEvent:
+                       XPeekEvent(app->list[d], event);
+                       app->last = (d == 0 ? app->count : d) - 1;
+                       UNLOCK_APP(app);
+                       return TRUE;
+               }
+               else {  /* input or timer or signal */
+                       /*
+                        * Check to see why a -1 was returned, if a timer expired,
+                        * call it and block some more
+                        */
+                       if ((app->timerQueue != NULL) && ! XtAppPeekEvent_SkipTimer) {  /* timer */
+                               struct timeval cur_time;
+                               Bool did_timer = False;
+
+                               X_GETTIMEOFDAY (&cur_time);
+                               FIXUP_TIMEVAL(cur_time);
+                               while (IS_AT_OR_AFTER(app->timerQueue->te_timer_value, cur_time)) {
+                                       TimerEventRec *te_ptr = app->timerQueue;
+                                       app->timerQueue = app->timerQueue->te_next;
+                                       te_ptr->te_next = NULL;
+                                       if (te_ptr->te_proc != NULL) {
+                                           TeCallProc(te_ptr);
+                                           did_timer = True;
+                                       }
+                                       LOCK_PROCESS;
+                                       te_ptr->te_next = freeTimerRecs;
+                                       freeTimerRecs = te_ptr;
+                                       UNLOCK_PROCESS;
+                                       if (app->timerQueue == NULL) break;
+                               }
+                               if (did_timer)
+                               {
+                                   for (d = 0; d < app->count; d++)
+                                   /* the timer's procedure may have caused an event */
+                                           if (XEventsQueued(app->list[d], QueuedAfterFlush)) {
+                                                   goto GotEvent;
+                                           }
+                                   continue;  /* keep blocking */
+                               }
+                       }
+                       /*
+                        * spec is vague here; we'll assume signals also return FALSE,
+                        * of course to determine whether a signal is pending requires
+                        * walking the signalQueue looking for se_notice flags which
+                        * this code doesn't do.
+                        */
+#if 0
+                       if (app->signalQueue != NULL) {  /* signal */
+                               event->xany.type = 0;
+                               event->xany.display = NULL;
+                               event->xany.window = 0;
+                               UNLOCK_APP(app);
+                               return FALSE;
+                       }
+                       else
+#endif
+                       {  /* input */
+                               event->xany.type = 0;
+                               event->xany.display = NULL;
+                               event->xany.window = 0;
+                               UNLOCK_APP(app);
+                               return FALSE;
+                       }
+               }
+       } /* end while */
+}
diff --git a/src/Object.c b/src/Object.c
new file mode 100644 (file)
index 0000000..ae1ac75
--- /dev/null
@@ -0,0 +1,304 @@
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+
+static XtResource resources[] = {
+        {XtNdestroyCallback, XtCCallback, XtRCallback,sizeof(XtPointer),
+         XtOffsetOf(ObjectRec,object.destroy_callbacks),
+        XtRCallback, (XtPointer)NULL}
+    };
+
+static void ObjectClassPartInitialize(WidgetClass);
+static Boolean ObjectSetValues(Widget, Widget, Widget, ArgList, Cardinal *);
+static void ObjectDestroy(Widget);
+
+externaldef(objectclassrec) ObjectClassRec objectClassRec = {
+  {
+    /* superclass        */    NULL,
+    /* class_name        */    "Object",
+    /* widget_size       */    sizeof(ObjectRec),
+    /* class_initialize   */    NULL,
+    /* class_part_initialize*/ ObjectClassPartInitialize,
+    /* class_inited       */   FALSE,
+    /* initialize        */    NULL,
+    /* initialize_hook    */   NULL,
+    /* pad                */    NULL,
+    /* pad               */    NULL,
+    /* pad               */    0,
+    /* resources         */    resources,
+    /* num_resources     */    XtNumber(resources),
+    /* xrm_class         */    NULLQUARK,
+    /* pad                */    FALSE,
+    /* pad                */    FALSE,
+    /* pad                */    FALSE,
+    /* pad                */    FALSE,
+    /* destroy           */    ObjectDestroy,
+    /* pad               */    NULL,
+    /* pad               */    NULL,
+    /* set_values        */    ObjectSetValues,
+    /* set_values_hook    */   NULL,
+    /* pad                */    NULL,
+    /* get_values_hook    */   NULL,
+    /* pad                */    NULL,
+    /* version           */    XtVersion,
+    /* callback_offsets   */    NULL,
+    /* pad                */    NULL,
+    /* pad                */    NULL,
+    /* pad                */    NULL,
+    /* extension           */  NULL
+}
+};
+
+externaldef(objectClass) WidgetClass objectClass
+                          = (WidgetClass)&objectClassRec;
+
+/*
+ * Start of object routines.
+ */
+
+
+static void ConstructCallbackOffsets(
+    WidgetClass widgetClass)
+{
+    static XrmQuark QCallback = NULLQUARK;
+    register int i;
+    register int tableSize;
+    register CallbackTable newTable;
+    register CallbackTable superTable;
+    register XrmResourceList resourceList;
+    ObjectClass objectClass = (ObjectClass)widgetClass;
+
+    /*
+      This function builds an array of pointers to the resource
+      structures which describe the callbacks for this widget class.
+      This array is special in that the 0th entry is the number of
+      callback pointers.
+     */
+
+    if (QCallback == NULLQUARK)
+       QCallback = XrmPermStringToQuark(XtRCallback);
+
+    if (objectClass->object_class.superclass != NULL) {
+       superTable = (CallbackTable)
+           ((ObjectClass) objectClass->object_class.superclass)->
+               object_class.callback_private;
+       tableSize = (int)(long) superTable[0];
+    } else {
+       superTable = (CallbackTable) NULL;
+       tableSize = 0;
+    }
+
+    /* Count the number of callbacks */
+    resourceList = (XrmResourceList) objectClass->object_class.resources;
+    for (i = objectClass->object_class.num_resources; --i >= 0; resourceList++)
+       if (resourceList->xrm_type == QCallback)
+           tableSize++;
+
+    /*
+     * Allocate and load the table.  Make sure that the new callback
+     * offsets occur in the table ahead of the superclass callback
+     * offsets so that resource overrides work.
+     */
+    newTable = (CallbackTable)
+       __XtMalloc(sizeof(XrmResource *) * (tableSize + 1));
+
+    newTable[0] = (XrmResource *)(long) tableSize;
+
+    if (superTable)
+       tableSize -= (int)(long) superTable[0];
+    resourceList = (XrmResourceList) objectClass->object_class.resources;
+    for (i=1; tableSize > 0; resourceList++)
+       if (resourceList->xrm_type == QCallback) {
+           newTable[i++] = resourceList;
+           tableSize--;
+       }
+
+    if (superTable)
+       for (tableSize = (int)(long) *superTable++;
+           --tableSize >= 0; superTable++)
+           newTable[i++] = *superTable;
+
+    objectClass->object_class.callback_private = (XtPointer) newTable;
+}
+
+static void InheritObjectExtensionMethods(
+    WidgetClass widget_class)
+{
+    ObjectClass oc = (ObjectClass) widget_class;
+    ObjectClassExtension ext, super_ext = NULL;
+
+    ext = (ObjectClassExtension)
+       XtGetClassExtension(widget_class,
+                   XtOffsetOf(ObjectClassRec, object_class.extension),
+                           NULLQUARK, XtObjectExtensionVersion,
+                           sizeof(ObjectClassExtensionRec));
+
+    if (oc->object_class.superclass)
+       super_ext = (ObjectClassExtension)
+           XtGetClassExtension(oc->object_class.superclass,
+                       XtOffsetOf(ObjectClassRec, object_class.extension),
+                               NULLQUARK, XtObjectExtensionVersion,
+                               sizeof(ObjectClassExtensionRec));
+    LOCK_PROCESS;
+    if (ext) {
+       if (ext->allocate == XtInheritAllocate)
+           ext->allocate = (super_ext ? super_ext->allocate : NULL);
+       if (ext->deallocate == XtInheritDeallocate)
+           ext->deallocate = (super_ext ? super_ext->deallocate : NULL);
+    } else if (super_ext) {
+       /* Be careful to inherit only what is appropriate */
+       ext = (ObjectClassExtension)
+           __XtCalloc(1, sizeof(ObjectClassExtensionRec));
+       ext->next_extension = oc->object_class.extension;
+       ext->record_type = NULLQUARK;
+       ext->version = XtObjectExtensionVersion;
+       ext->record_size = sizeof(ObjectClassExtensionRec);
+       ext->allocate = super_ext->allocate;
+       ext->deallocate = super_ext->deallocate;
+       oc->object_class.extension = (XtPointer) ext;
+    }
+    UNLOCK_PROCESS;
+}
+
+static void ObjectClassPartInitialize(
+    register WidgetClass wc)
+{
+   ObjectClass oc = (ObjectClass)wc;
+
+   oc->object_class.xrm_class =
+       XrmPermStringToQuark(oc->object_class.class_name);
+
+   if (oc->object_class.resources)
+       _XtCompileResourceList(oc->object_class.resources,
+                             oc->object_class.num_resources);
+
+   ConstructCallbackOffsets(wc);
+   _XtResourceDependencies(wc);
+   InheritObjectExtensionMethods(wc);
+}
+
+
+/*ARGSUSED*/
+static Boolean ObjectSetValues(
+    Widget     old,
+    Widget     request,
+    Widget     widget,
+    ArgList    args,
+    Cardinal * num_args)
+{
+    register CallbackTable offsets;
+    register int i;
+    register InternalCallbackList *ol, *nl;
+
+    LOCK_PROCESS;
+    /* Compile any callback lists into internal form */
+    offsets = (CallbackTable) XtClass(widget)->core_class.callback_private;
+
+    for (i= (int)(long) *(offsets++); --i >= 0; offsets++) {
+       ol = (InternalCallbackList *)
+           ((char *) old - (*offsets)->xrm_offset - 1);
+       nl = (InternalCallbackList *)
+           ((char *) widget - (*offsets)->xrm_offset - 1);
+       if (*ol != *nl) {
+           if (*ol != NULL)
+               XtFree((char *) *ol);
+           if (*nl != NULL)
+               *nl = _XtCompileCallbackList((XtCallbackList) *nl);
+       }
+    }
+    UNLOCK_PROCESS;
+    return False;
+}
+
+
+static void ObjectDestroy (
+    register Widget    widget)
+{
+    register CallbackTable offsets;
+    register int i;
+    register InternalCallbackList cl;
+
+    /* Remove all callbacks associated with widget */
+    LOCK_PROCESS;
+    offsets = (CallbackTable)
+       widget->core.widget_class->core_class.callback_private;
+
+    for (i = (int)(long) *(offsets++); --i >= 0; offsets++) {
+       cl = *(InternalCallbackList *)
+           ((char *) widget - (*offsets)->xrm_offset - 1);
+       if (cl) XtFree((char *) cl);
+    }
+    UNLOCK_PROCESS;
+} /* ObjectDestroy */
diff --git a/src/PassivGrab.c b/src/PassivGrab.c
new file mode 100644 (file)
index 0000000..8d3a1d1
--- /dev/null
@@ -0,0 +1,1064 @@
+/*
+
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+*/
+/********************************************************
+
+Copyright 1988 by Hewlett-Packard Company
+Copyright 1987, 1988, 1989,1990 by Digital Equipment Corporation, Maynard, Massachusetts
+
+Permission to use, copy, modify, and distribute this software
+and its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that copyright notice and this permission
+notice appear in supporting documentation, and that the names of
+Hewlett-Packard or Digital not be used in advertising or
+publicity pertaining to distribution of the software without specific,
+written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+********************************************************/
+
+/*
+
+Copyright 1987, 1988, 1989, 1990, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+#include "PassivGraI.h"
+
+/* typedef unsigned long Mask; */
+#define BITMASK(i) (((Mask)1) << ((i) & 31))
+#define MASKIDX(i) ((i) >> 5)
+#define MASKWORD(buf, i) buf[MASKIDX(i)]
+#define BITSET(buf, i) MASKWORD(buf, i) |= BITMASK(i)
+#define BITCLEAR(buf, i) MASKWORD(buf, i) &= ~BITMASK(i)
+#define GETBIT(buf, i) (MASKWORD(buf, i) & BITMASK(i))
+#define MasksPerDetailMask 8
+
+#define pDisplay(grabPtr) (((grabPtr)->widget)->core.screen->display)
+#define pWindow(grabPtr) (((grabPtr)->widget)->core.window)
+
+
+/***************************************************************************/
+/*********************** Internal Support Routines *************************/
+/***************************************************************************/
+
+/*
+ * Turn off (clear) the bit in the specified detail mask which is associated
+ * with the detail.
+ */
+
+static void DeleteDetailFromMask(
+    Mask **ppDetailMask,
+    unsigned short detail)
+{
+    Mask *pDetailMask = *ppDetailMask;
+
+    if (!pDetailMask) {
+       int i;
+       pDetailMask = (Mask *)__XtMalloc(sizeof(Mask) * MasksPerDetailMask);
+       for (i = MasksPerDetailMask; --i >= 0; )
+           pDetailMask[i] = ~0;
+       *ppDetailMask = pDetailMask;
+    }
+    BITCLEAR((pDetailMask), detail);
+}
+
+
+/*
+ * Make an exact copy of the specified detail mask.
+ */
+
+static Mask *CopyDetailMask(
+    Mask *pOriginalDetailMask)
+{
+    Mask *pTempMask;
+    int i;
+
+    if (!pOriginalDetailMask)
+       return NULL;
+
+    pTempMask = (Mask *)__XtMalloc(sizeof(Mask) * MasksPerDetailMask);
+
+    for ( i = 0; i < MasksPerDetailMask; i++)
+      pTempMask[i]= pOriginalDetailMask[i];
+
+    return pTempMask;
+}
+
+
+/*
+ * Allocate a new grab entry, and fill in all of the fields using the
+ * specified parameters.
+ */
+
+static XtServerGrabPtr CreateGrab(
+    Widget     widget,
+    Boolean    ownerEvents,
+    Modifiers  modifiers,
+    KeyCode    keybut,
+    int                pointer_mode,
+    int                keyboard_mode,
+    Mask       event_mask,
+    Window     confine_to,
+    Cursor     cursor,
+    Boolean    need_ext)
+{
+    XtServerGrabPtr grab;
+
+    if (confine_to || cursor)
+       need_ext = True;
+    grab = (XtServerGrabPtr)__XtMalloc(sizeof(XtServerGrabRec) +
+                                    (need_ext ? sizeof(XtServerGrabExtRec)
+                                     : 0));
+    grab->next = NULL;
+    grab->widget = widget;
+    grab->ownerEvents = ownerEvents;
+    grab->pointerMode = pointer_mode;
+    grab->keyboardMode = keyboard_mode;
+    grab->eventMask = event_mask;
+    grab->hasExt = need_ext;
+    grab->confineToIsWidgetWin = (XtWindow (widget) == confine_to);
+    grab->modifiers = modifiers;
+    grab->keybut = keybut;
+    if (need_ext) {
+       XtServerGrabExtPtr ext = GRABEXT(grab);
+       ext->pModifiersMask = NULL;
+       ext->pKeyButMask = NULL;
+       ext->confineTo = confine_to;
+       ext->cursor = cursor;
+    }
+    return grab;
+}
+
+
+/*
+ * Free up the space occupied by a grab entry.
+ */
+
+static void FreeGrab(
+    XtServerGrabPtr pGrab)
+{
+    if (pGrab->hasExt) {
+       XtServerGrabExtPtr ext = GRABEXT(pGrab);
+       if (ext->pModifiersMask)
+           XtFree((char *)ext->pModifiersMask);
+       if (ext->pKeyButMask)
+           XtFree((char *)ext->pKeyButMask);
+    }
+    XtFree((char *)pGrab);
+}
+
+typedef struct _DetailRec {
+    unsigned short     exact;
+    Mask               *pMask;
+} DetailRec, *DetailPtr;
+
+/*
+ * If the first detail is set to 'exception' and the second detail
+ * is contained in the mask of the first, then TRUE is returned.
+ */
+
+static Bool IsInGrabMask(
+    register DetailPtr firstDetail,
+    register DetailPtr secondDetail,
+    unsigned short exception)
+{
+    if (firstDetail->exact == exception) {
+       if (!firstDetail->pMask)
+           return TRUE;
+
+       /* (at present) never called with two non-null pMasks */
+       if (secondDetail->exact == exception)
+           return FALSE;
+
+       if (GETBIT(firstDetail->pMask, secondDetail->exact))
+           return TRUE;
+    }
+
+    return FALSE;
+}
+
+
+/*
+ * If neither of the details is set to 'exception', and they match
+ * exactly, then TRUE is returned.
+ */
+
+static Bool IdenticalExactDetails(
+    unsigned short firstExact,
+    unsigned short secondExact,
+    unsigned short exception)
+{
+    if ((firstExact == exception) || (secondExact == exception))
+       return FALSE;
+
+    if (firstExact == secondExact)
+       return TRUE;
+
+    return FALSE;
+}
+
+
+/*
+ * If the first detail is set to 'exception', and its mask has the bit
+ * enabled which corresponds to the second detail, OR if neither of the
+ * details is set to 'exception' and the details match exactly, then
+ * TRUE is returned.
+ */
+
+static Bool DetailSupersedesSecond(
+    register DetailPtr firstDetail,
+    register DetailPtr secondDetail,
+    unsigned short exception)
+{
+    if (IsInGrabMask(firstDetail, secondDetail, exception))
+       return TRUE;
+
+    if (IdenticalExactDetails(firstDetail->exact, secondDetail->exact,
+                             exception))
+       return TRUE;
+
+    return FALSE;
+}
+
+
+/*
+ * If the two grab events match exactly, or if the first grab entry
+ * 'encompasses' the second grab entry, then TRUE is returned.
+ */
+
+static Bool GrabSupersedesSecond(
+    register XtServerGrabPtr pFirstGrab,
+    register XtServerGrabPtr pSecondGrab)
+{
+    DetailRec first, second;
+
+    first.exact = pFirstGrab->modifiers;
+    if (pFirstGrab->hasExt)
+       first.pMask = GRABEXT(pFirstGrab)->pModifiersMask;
+    else
+       first.pMask = NULL;
+    second.exact = pSecondGrab->modifiers;
+    if (pSecondGrab->hasExt)
+       second.pMask = GRABEXT(pSecondGrab)->pModifiersMask;
+    else
+       second.pMask = NULL;
+    if (!DetailSupersedesSecond(&first, &second, (unsigned short)AnyModifier))
+      return FALSE;
+
+    first.exact = pFirstGrab->keybut;
+    if (pFirstGrab->hasExt)
+       first.pMask = GRABEXT(pFirstGrab)->pKeyButMask;
+    else
+       first.pMask = NULL;
+    second.exact = pSecondGrab->keybut;
+    if (pSecondGrab->hasExt)
+       second.pMask = GRABEXT(pSecondGrab)->pKeyButMask;
+    else
+       second.pMask = NULL;
+    if (DetailSupersedesSecond(&first, &second, (unsigned short)AnyKey))
+      return TRUE;
+
+    return FALSE;
+}
+
+
+/*
+ * Two grabs are considered to be matching if either of the following are true:
+ *
+ * 1) The two grab entries match exactly, or the first grab entry
+ *    encompasses the second grab entry.
+ * 2) The second grab entry encompasses the first grab entry.
+ * 3) The keycodes match exactly, and one entry's modifiers encompasses
+ *    the others.
+ * 4) The keycode for one entry encompasses the other, and the detail
+ *    for the other entry encompasses the first.
+ */
+
+static Bool GrabMatchesSecond(
+    register XtServerGrabPtr pFirstGrab,
+    register XtServerGrabPtr pSecondGrab)
+{
+    DetailRec firstD, firstM, secondD, secondM;
+
+    if (pDisplay(pFirstGrab) != pDisplay(pSecondGrab))
+       return FALSE;
+
+    if (GrabSupersedesSecond(pFirstGrab, pSecondGrab))
+       return TRUE;
+
+    if (GrabSupersedesSecond(pSecondGrab, pFirstGrab))
+       return TRUE;
+
+    firstD.exact = pFirstGrab->keybut;
+    firstM.exact = pFirstGrab->modifiers;
+    if (pFirstGrab->hasExt) {
+       firstD.pMask = GRABEXT(pFirstGrab)->pKeyButMask;
+       firstM.pMask = GRABEXT(pFirstGrab)->pModifiersMask;
+    } else {
+       firstD.pMask = NULL;
+       firstM.pMask = NULL;
+    }
+    secondD.exact = pSecondGrab->keybut;
+    secondM.exact = pSecondGrab->modifiers;
+    if (pSecondGrab->hasExt) {
+       secondD.pMask = GRABEXT(pSecondGrab)->pKeyButMask;
+       secondM.pMask = GRABEXT(pSecondGrab)->pModifiersMask;
+    } else {
+       secondD.pMask = NULL;
+       secondM.pMask = NULL;
+    }
+
+    if (DetailSupersedesSecond(&secondD, &firstD, (unsigned short)AnyKey) &&
+       DetailSupersedesSecond(&firstM, &secondM, (unsigned short)AnyModifier))
+       return TRUE;
+
+    if (DetailSupersedesSecond(&firstD, &secondD, (unsigned short)AnyKey) &&
+       DetailSupersedesSecond(&secondM, &firstM, (unsigned short)AnyModifier))
+       return TRUE;
+
+    return FALSE;
+}
+
+
+/*
+ * Delete a grab combination from the passive grab list.  Each entry will
+ * be checked to see if it is affected by the grab being deleted.  This
+ * may result in multiple entries being modified/deleted.
+ */
+
+static void DeleteServerGrabFromList(
+    XtServerGrabPtr    *passiveListPtr,
+    XtServerGrabPtr    pMinuendGrab)
+{
+    register XtServerGrabPtr *next;
+    register XtServerGrabPtr grab;
+    register XtServerGrabExtPtr ext;
+
+    for (next = passiveListPtr; (grab = *next); )
+    {
+       if (GrabMatchesSecond(grab, pMinuendGrab) &&
+           (pDisplay(grab) == pDisplay(pMinuendGrab)))
+       {
+           if (GrabSupersedesSecond(pMinuendGrab, grab))
+           {
+               /*
+                * The entry being deleted encompasses the list entry,
+                * so delete the list entry.
+                */
+               *next = grab->next;
+               FreeGrab(grab);
+               continue;
+           }
+
+           if (!grab->hasExt) {
+               grab = (XtServerGrabPtr)
+                   XtRealloc((char *)grab, (sizeof(XtServerGrabRec) +
+                                            sizeof(XtServerGrabExtRec)));
+               *next = grab;
+               grab->hasExt = True;
+               ext = GRABEXT(grab);
+               ext->pKeyButMask = NULL;
+               ext->pModifiersMask = NULL;
+               ext->confineTo = None;
+               ext->cursor = None;
+           } else
+               ext = GRABEXT(grab);
+           if ((grab->keybut == AnyKey) && (grab->modifiers != AnyModifier))
+           {
+               /*
+                * If the list entry has the key detail of AnyKey, and
+                * a modifier detail not set to AnyModifier, then we
+                * simply need to turn off the key detail bit in the
+                * list entry's key detail mask.
+                */
+               DeleteDetailFromMask(&ext->pKeyButMask, pMinuendGrab->keybut);
+           } else if ((grab->modifiers == AnyModifier) &&
+                      (grab->keybut != AnyKey)) {
+               /*
+                * The list entry has a specific key detail, but its
+                * modifier detail is set to AnyModifier; so, we only
+                * need to turn off the specified modifier combination
+                * in the list entry's modifier mask.
+                */
+               DeleteDetailFromMask(&ext->pModifiersMask,
+                                    pMinuendGrab->modifiers);
+           } else if ((pMinuendGrab->keybut != AnyKey) &&
+                      (pMinuendGrab->modifiers != AnyModifier)) {
+               /*
+                * The list entry has a key detail of AnyKey and a
+                * modifier detail of AnyModifier; the entry being
+                * deleted has a specific key and a specific modifier
+                * combination.  Therefore, we need to mask off the
+                * keycode from the list entry, and also create a
+                * new entry for this keycode, which has a modifier
+                * mask set to AnyModifier & ~(deleted modifiers).
+                */
+               XtServerGrabPtr pNewGrab;
+
+               DeleteDetailFromMask(&ext->pKeyButMask, pMinuendGrab->keybut);
+               pNewGrab = CreateGrab(grab->widget,
+                                     (Boolean)grab->ownerEvents,
+                                     (Modifiers)AnyModifier,
+                                     pMinuendGrab->keybut,
+                                     (int)grab->pointerMode,
+                                     (int)grab->keyboardMode,
+                                     (Mask)0, (Window)0, (Cursor)0, True);
+               GRABEXT(pNewGrab)->pModifiersMask =
+                   CopyDetailMask(ext->pModifiersMask);
+
+               DeleteDetailFromMask(&GRABEXT(pNewGrab)->pModifiersMask,
+                                    pMinuendGrab->modifiers);
+
+               pNewGrab->next = *passiveListPtr;
+               *passiveListPtr = pNewGrab;
+           } else if (pMinuendGrab->keybut == AnyKey) {
+               /*
+                * The list entry has keycode AnyKey and modifier
+                * AnyModifier; the entry being deleted has
+                * keycode AnyKey and specific modifiers.  So we
+                * simply need to mask off the specified modifier
+                * combination.
+                */
+               DeleteDetailFromMask(&ext->pModifiersMask,
+                                    pMinuendGrab->modifiers);
+           } else {
+               /*
+                * The list entry has keycode AnyKey and modifier
+                * AnyModifier; the entry being deleted has a
+                * specific keycode and modifier AnyModifier.  So
+                * we simply need to mask off the specified
+                * keycode.
+                */
+               DeleteDetailFromMask(&ext->pKeyButMask, pMinuendGrab->keybut);
+           }
+       }
+       next = &(*next)->next;
+    }
+}
+
+static void DestroyPassiveList(
+    XtServerGrabPtr    *passiveListPtr)
+{
+    XtServerGrabPtr    next, grab;
+
+    for (next = *passiveListPtr; next; ) {
+       grab = next;
+       next = grab->next;
+
+       /* not necessary to explicitly ungrab key or button;
+        * window is being destroyed so server will take care of it.
+        */
+
+       FreeGrab(grab);
+    }
+}
+
+
+/*
+ * This function is called at widget destroy time to clean up
+ */
+/*ARGSUSED*/
+void _XtDestroyServerGrabs(
+    Widget             w,
+    XtPointer          closure,
+    XtPointer          call_data) /* unused */
+{
+    XtPerWidgetInput   pwi = (XtPerWidgetInput)closure;
+    XtPerDisplayInput  pdi;
+
+    LOCK_PROCESS;
+    pdi = _XtGetPerDisplayInput(XtDisplay(w));
+    _XtClearAncestorCache(w);
+    UNLOCK_PROCESS;
+
+    /* Remove the active grab, if necessary */
+    if ((pdi->keyboard.grabType != XtNoServerGrab) &&
+       (pdi->keyboard.grab.widget == w)) {
+       pdi->keyboard.grabType = XtNoServerGrab;
+       pdi->activatingKey = (KeyCode)0;
+    }
+    if ((pdi->pointer.grabType != XtNoServerGrab) &&
+       (pdi->pointer.grab.widget == w))
+       pdi->pointer.grabType = XtNoServerGrab;
+
+    DestroyPassiveList(&pwi->keyList);
+    DestroyPassiveList(&pwi->ptrList);
+
+    _XtFreePerWidgetInput(w, pwi);
+}
+
+/*
+ * If the incoming event is on the passive grab list, then activate
+ * the grab.  The grab will remain in effect until the key is released.
+ */
+
+XtServerGrabPtr _XtCheckServerGrabsOnWidget (
+    XEvent             *event,
+    Widget             widget,
+    _XtBoolean         isKeyboard)
+{
+    register XtServerGrabPtr grab;
+    XtServerGrabRec    tempGrab;
+    XtServerGrabPtr    *passiveListPtr;
+    XtPerWidgetInput   pwi;
+
+    LOCK_PROCESS;
+    pwi = _XtGetPerWidgetInput(widget, FALSE);
+    UNLOCK_PROCESS;
+    if (!pwi)
+       return (XtServerGrabPtr)NULL;
+    if (isKeyboard)
+       passiveListPtr = &pwi->keyList;
+    else
+       passiveListPtr = &pwi->ptrList;
+
+    /*
+     * if either there is no entry in the context manager or the entry
+     * is empty, or the keyboard is grabed, then no work to be done
+     */
+    if (!*passiveListPtr)
+       return (XtServerGrabPtr)NULL;
+
+    /* Take only the lower thirteen bits as modifier state.  The X Keyboard
+     * Extension may be representing keyboard group state in two upper bits.
+     */
+    tempGrab.widget = widget;
+    tempGrab.keybut = event->xkey.keycode; /* also xbutton.button */
+    tempGrab.modifiers = event->xkey.state & 0x1FFF; /*also xbutton.state*/
+    tempGrab.hasExt = False;
+
+    for (grab = *passiveListPtr; grab; grab = grab->next) {
+       if (GrabMatchesSecond(&tempGrab, grab))
+           return (grab);
+    }
+    return (XtServerGrabPtr)NULL;
+}
+
+/*
+ * This handler is needed to guarantee that we see releases on passive
+ * button grabs for widgets that haven't selected for button release.
+ */
+
+/*ARGSUSED*/
+static void  ActiveHandler (
+    Widget             widget,
+    XtPointer          pdi,
+    XEvent             *event,
+    Boolean            *cont)
+{
+    /* nothing */
+}
+
+
+/*
+ *     MakeGrab
+ */
+static void  MakeGrab(
+    XtServerGrabPtr    grab,
+    XtServerGrabPtr    *passiveListPtr,
+    Boolean            isKeyboard,
+    XtPerDisplayInput  pdi,
+    XtPerWidgetInput   pwi)
+{
+    if (!isKeyboard && !pwi->active_handler_added) {
+       XtAddEventHandler(grab->widget, ButtonReleaseMask, FALSE,
+                         ActiveHandler, (XtPointer)pdi);
+       pwi->active_handler_added = TRUE;
+    }
+
+    if (isKeyboard) {
+       XGrabKey(pDisplay(grab),
+                grab->keybut, grab->modifiers,
+                pWindow(grab), grab->ownerEvents,
+                grab->pointerMode, grab->keyboardMode);
+    } else {
+       Window confineTo = None;
+       Cursor cursor = None;
+
+       if (grab->hasExt) {
+           if (grab->confineToIsWidgetWin)
+               confineTo = XtWindow (grab->widget);
+           else
+               confineTo = GRABEXT(grab)->confineTo;
+           cursor = GRABEXT(grab)->cursor;
+       }
+       XGrabButton(pDisplay(grab),
+                   grab->keybut, grab->modifiers,
+                   pWindow(grab), grab->ownerEvents, grab->eventMask,
+                   grab->pointerMode, grab->keyboardMode,
+                   confineTo, cursor);
+    }
+
+    /* Add the new grab entry to the passive key grab list */
+    grab->next = *passiveListPtr;
+    *passiveListPtr = grab;
+}
+
+static void MakeGrabs(
+    XtServerGrabPtr    *passiveListPtr,
+    Boolean            isKeyboard,
+    XtPerDisplayInput  pdi)
+{
+    XtServerGrabPtr    next = *passiveListPtr;
+    XtServerGrabPtr    grab;
+    XtPerWidgetInput   pwi;
+    /*
+     * make MakeGrab build a new list that has had the merge
+     * processing done on it. Start with an empty list
+     * (passiveListPtr).
+     */
+    LOCK_PROCESS;
+    *passiveListPtr = NULL;
+    while (next)
+      {
+         grab = next;
+         next = grab->next;
+         pwi = _XtGetPerWidgetInput(grab->widget, FALSE);
+         MakeGrab(grab, passiveListPtr, isKeyboard, pdi, pwi);
+      }
+    UNLOCK_PROCESS;
+}
+
+/*
+ * This function is the event handler attached to the associated widget
+ * when grabs need to be added, but the widget is not yet realized.  When
+ * it is first mapped, this handler will be invoked, and it will add all
+ * needed grabs.
+ */
+
+/*ARGSUSED*/
+static void  RealizeHandler (
+    Widget             widget,
+    XtPointer          closure,
+    XEvent             *event, /* unused */
+    Boolean            *cont)  /* unused */
+{
+    XtPerWidgetInput   pwi = (XtPerWidgetInput)closure;
+    XtPerDisplayInput  pdi;
+
+    LOCK_PROCESS;
+    pdi = _XtGetPerDisplayInput(XtDisplay(widget));
+    UNLOCK_PROCESS;
+    MakeGrabs(&pwi->keyList, KEYBOARD, pdi);
+    MakeGrabs(&pwi->ptrList, POINTER, pdi);
+
+    XtRemoveEventHandler(widget, XtAllEvents, True,
+                        RealizeHandler, (XtPointer)pwi);
+    pwi->realize_handler_added = FALSE;
+}
+
+/***************************************************************************/
+/**************************** Global Routines ******************************/
+/***************************************************************************/
+
+
+/*
+ * Routine used by an application to set up a passive grab for a key/modifier
+ * combination.
+ */
+
+static
+void GrabKeyOrButton (
+    Widget     widget,
+    KeyCode    keyOrButton,
+    Modifiers  modifiers,
+    Boolean    owner_events,
+    int        pointer_mode,
+    int        keyboard_mode,
+    Mask       event_mask,
+    Window     confine_to,
+    Cursor     cursor,
+    Boolean    isKeyboard)
+{
+    XtServerGrabPtr    *passiveListPtr;
+    XtServerGrabPtr    newGrab;
+    XtPerWidgetInput   pwi;
+    XtPerDisplayInput  pdi;
+
+
+    XtCheckSubclass(widget, coreWidgetClass, "in XtGrabKey or XtGrabButton");
+    LOCK_PROCESS;
+    pwi = _XtGetPerWidgetInput(widget, TRUE);
+    if (isKeyboard)
+      passiveListPtr = &pwi->keyList;
+    else
+      passiveListPtr = &pwi->ptrList;
+    pdi = _XtGetPerDisplayInput(XtDisplay(widget));
+    UNLOCK_PROCESS;
+    newGrab = CreateGrab(widget, owner_events, modifiers,
+                        keyOrButton, pointer_mode, keyboard_mode,
+                        event_mask, confine_to, cursor, False);
+    /*
+     *  if the widget is realized then process the entry into the grab
+     * list. else if the list is empty (i.e. first time) then add the
+     * event handler. then add the raw entry to the list for processing
+     * in the handler at realize time.
+     */
+    if (XtIsRealized(widget))
+      MakeGrab(newGrab, passiveListPtr, isKeyboard, pdi, pwi);
+    else {
+       if (!pwi->realize_handler_added)
+           {
+               XtAddEventHandler(widget, StructureNotifyMask, FALSE,
+                                 RealizeHandler,
+                                 (XtPointer)pwi);
+               pwi->realize_handler_added = TRUE;
+           }
+
+       while (*passiveListPtr)
+           passiveListPtr = &(*passiveListPtr)->next;
+       *passiveListPtr = newGrab;
+    }
+}
+
+
+static
+void   UngrabKeyOrButton (
+    Widget     widget,
+    int                keyOrButton,
+    Modifiers  modifiers,
+    Boolean    isKeyboard)
+{
+    XtServerGrabRec    tempGrab;
+    XtPerWidgetInput   pwi;
+
+    XtCheckSubclass(widget, coreWidgetClass,
+                   "in XtUngrabKey or XtUngrabButton");
+
+    /* Build a temporary grab list entry */
+    tempGrab.widget = widget;
+    tempGrab.modifiers = modifiers;
+    tempGrab.keybut = keyOrButton;
+    tempGrab.hasExt = False;
+
+    LOCK_PROCESS;
+    pwi = _XtGetPerWidgetInput(widget, FALSE);
+    UNLOCK_PROCESS;
+    /*
+     * if there is no entry in the context manager then somethings wrong
+     */
+    if (!pwi)
+      {
+         XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+                      "invalidGrab", "ungrabKeyOrButton", XtCXtToolkitError,
+                      "Attempt to remove nonexistent passive grab",
+                      (String *)NULL, (Cardinal *)NULL);
+         return;
+      }
+
+    if (XtIsRealized(widget))
+      {
+         if (isKeyboard)
+           XUngrabKey(widget->core.screen->display,
+                      keyOrButton, (unsigned int)modifiers,
+                      widget->core.window);
+         else
+           XUngrabButton(widget->core.screen->display,
+                         keyOrButton, (unsigned int)modifiers,
+                         widget->core.window);
+      }
+
+
+    /* Delete all entries which are encompassed by the specified grab. */
+    DeleteServerGrabFromList(isKeyboard ? &pwi->keyList : &pwi->ptrList,
+                            &tempGrab);
+}
+
+void  XtGrabKey (
+    Widget     widget,
+    _XtKeyCode keycode,
+    Modifiers  modifiers,
+    _XtBoolean owner_events,
+    int        pointer_mode,
+    int        keyboard_mode)
+{
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    GrabKeyOrButton(widget, (KeyCode)keycode, modifiers, owner_events,
+                   pointer_mode, keyboard_mode,
+                   (Mask)0, (Window)None, (Cursor)None, KEYBOARD);
+    UNLOCK_APP(app);
+}
+
+void  XtGrabButton(
+    Widget     widget,
+    int                button,
+    Modifiers  modifiers,
+    _XtBoolean owner_events,
+    unsigned int event_mask,
+    int        pointer_mode,
+    int        keyboard_mode,
+    Window     confine_to,
+    Cursor     cursor)
+{
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    GrabKeyOrButton(widget, (KeyCode)button, modifiers, owner_events,
+                   pointer_mode, keyboard_mode,
+                   (Mask)event_mask, confine_to, cursor, POINTER);
+    UNLOCK_APP(app);
+}
+
+
+/*
+ * Routine used by an application to clear a passive grab for a key/modifier
+ * combination.
+ */
+
+void   XtUngrabKey (
+    Widget     widget,
+    _XtKeyCode keycode,
+    Modifiers  modifiers)
+{
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    UngrabKeyOrButton(widget, (int)keycode, modifiers, KEYBOARD);
+    UNLOCK_APP(app);
+}
+
+void   XtUngrabButton (
+    Widget     widget,
+    unsigned int button,
+    Modifiers  modifiers)
+{
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    UngrabKeyOrButton(widget, (KeyCode)button, modifiers, POINTER);
+    UNLOCK_APP(app);
+}
+
+/*
+ * Active grab of Device. clear any client side grabs so we dont lock
+ */
+static int GrabDevice (
+    Widget     widget,
+    Boolean    owner_events,
+    int        pointer_mode,
+    int        keyboard_mode,
+    Mask       event_mask,
+    Window     confine_to,
+    Cursor     cursor,
+    Time       time,
+    Boolean    isKeyboard)
+{
+    XtPerDisplayInput  pdi;
+    int                        returnVal;
+
+    XtCheckSubclass(widget, coreWidgetClass,
+                   "in XtGrabKeyboard or XtGrabPointer");
+    if (!XtIsRealized(widget))
+       return GrabNotViewable;
+    LOCK_PROCESS;
+    pdi = _XtGetPerDisplayInput(XtDisplay(widget));
+    UNLOCK_PROCESS;
+    if (!isKeyboard)
+      returnVal = XGrabPointer(XtDisplay(widget), XtWindow(widget),
+                              owner_events, event_mask,
+                              pointer_mode, keyboard_mode,
+                              confine_to, cursor, time);
+    else
+      returnVal = XGrabKeyboard(XtDisplay(widget), XtWindow(widget),
+                               owner_events, pointer_mode,
+                               keyboard_mode, time);
+
+    if (returnVal == GrabSuccess) {
+         XtDevice              device;
+
+         device = isKeyboard ? &pdi->keyboard : &pdi->pointer;
+         /* fill in the server grab rec */
+         device->grab.widget = widget;
+         device->grab.modifiers = 0;
+         device->grab.keybut = 0;
+         device->grab.ownerEvents = owner_events;
+         device->grab.pointerMode = pointer_mode;
+         device->grab.keyboardMode = keyboard_mode;
+         device->grab.hasExt = False;
+         device->grabType = XtActiveServerGrab;
+         pdi->activatingKey = (KeyCode)0;
+      }
+    return returnVal;
+}
+
+static void   UngrabDevice(
+    Widget     widget,
+    Time       time,
+    Boolean    isKeyboard)
+{
+    XtPerDisplayInput pdi;
+    XtDevice device;
+
+    LOCK_PROCESS;
+    pdi = _XtGetPerDisplayInput(XtDisplay(widget));
+    UNLOCK_PROCESS;
+    device = isKeyboard ? &pdi->keyboard : &pdi->pointer;
+    XtCheckSubclass(widget, coreWidgetClass,
+                   "in XtUngrabKeyboard or XtUngrabPointer");
+
+    if (device->grabType != XtNoServerGrab) {
+
+       if (device->grabType != XtPseudoPassiveServerGrab
+           && XtIsRealized(widget)) {
+           if (isKeyboard)
+               XUngrabKeyboard(XtDisplay(widget), time);
+           else
+               XUngrabPointer(XtDisplay(widget), time);
+       }
+       device->grabType = XtNoServerGrab;
+       pdi->activatingKey = (KeyCode)0;
+    }
+}
+
+
+/*
+ * Active grab of keyboard. clear any client side grabs so we dont lock
+ */
+int XtGrabKeyboard (
+    Widget     widget,
+    _XtBoolean owner_events,
+    int        pointer_mode,
+    int        keyboard_mode,
+    Time       time)
+{
+    int retval;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    retval = GrabDevice (widget, owner_events,
+                       pointer_mode, keyboard_mode,
+                       (Mask)0, (Window)None, (Cursor)None, time, KEYBOARD);
+    UNLOCK_APP(app);
+    return retval;
+}
+
+
+/*
+ * Ungrab the keyboard
+ */
+
+void   XtUngrabKeyboard(
+    Widget     widget,
+    Time       time)
+{
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    UngrabDevice(widget, time, KEYBOARD);
+    UNLOCK_APP(app);
+}
+
+
+
+
+/*
+ * grab the pointer
+ */
+int XtGrabPointer (
+    Widget     widget,
+    _XtBoolean owner_events,
+    unsigned int event_mask,
+    int        pointer_mode,
+    int        keyboard_mode,
+    Window     confine_to,
+    Cursor     cursor,
+    Time       time)
+{
+    int retval;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    retval = GrabDevice (widget, owner_events,
+                       pointer_mode, keyboard_mode,
+                       (Mask)event_mask, confine_to,
+                       cursor, time, POINTER);
+    UNLOCK_APP(app);
+    return retval;
+}
+
+
+/*
+ * Ungrab the pointer
+ */
+
+void   XtUngrabPointer(
+    Widget     widget,
+    Time       time)
+{
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    UngrabDevice(widget, time, POINTER);
+    UNLOCK_APP(app);
+}
+
+
+void _XtRegisterPassiveGrabs (
+    Widget     widget)
+{
+    XtPerWidgetInput   pwi = _XtGetPerWidgetInput (widget, FALSE);
+
+    if (pwi != NULL && !pwi->realize_handler_added) {
+       XtAddEventHandler(widget, StructureNotifyMask, FALSE,
+                         RealizeHandler,
+                         (XtPointer)pwi);
+       pwi->realize_handler_added = TRUE;
+    }
+}
diff --git a/src/Pointer.c b/src/Pointer.c
new file mode 100644 (file)
index 0000000..4e53717
--- /dev/null
@@ -0,0 +1,113 @@
+/********************************************************
+
+Copyright 1988 by Hewlett-Packard Company
+Copyright 1987, 1988, 1989 by Digital Equipment Corporation, Maynard
+
+Permission to use, copy, modify, and distribute this software
+and its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that copyright notice and this permission
+notice appear in supporting documentation, and that the names of
+Hewlett-Packard or Digital not be used in advertising or
+publicity pertaining to distribution of the software without specific,
+written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+********************************************************/
+
+/*
+
+Copyright 1987, 1988, 1989, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "PassivGraI.h"
+
+
+#define AllButtonsMask (Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask)
+
+Widget _XtProcessPointerEvent(
+    XButtonEvent       *event,
+    Widget             widget,
+    XtPerDisplayInput  pdi)
+{
+    XtDevice           device = &pdi->pointer;
+    XtServerGrabPtr    newGrab = NULL, devGrab = &device->grab;
+    Widget             dspWidget = NULL;
+    Boolean            deactivateGrab = FALSE;
+
+    switch (event->type)
+      {
+       case ButtonPress:
+         {
+             if (!IsServerGrab(device->grabType))
+               {
+                   Cardinal            i;
+
+                   for (i = pdi->traceDepth;
+                        i > 0 && !newGrab;
+                        i--)
+                     newGrab = _XtCheckServerGrabsOnWidget((XEvent*)event,
+                                                           pdi->trace[i-1],
+                                                           POINTER);
+               }
+             if (newGrab)
+               {
+                   /* Activate the grab */
+                   device->grab = *newGrab;
+                   device->grabType = XtPassiveServerGrab;
+               }
+         }
+         break;
+
+       case ButtonRelease:
+         {
+             if ((device->grabType == XtPassiveServerGrab) &&
+                 !(event->state & ~(Button1Mask << (event->button - 1)) &
+                   AllButtonsMask))
+               deactivateGrab = TRUE;
+         }
+         break;
+      }
+
+    if (IsServerGrab(device->grabType) && !(devGrab)->ownerEvents)
+      dspWidget = (devGrab)->widget;
+    else
+      dspWidget = widget;
+
+    if (deactivateGrab)
+      device->grabType = XtNoServerGrab;
+
+    return dspWidget;
+}
diff --git a/src/Popup.c b/src/Popup.c
new file mode 100644 (file)
index 0000000..3f4554b
--- /dev/null
@@ -0,0 +1,195 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "ShellP.h"
+
+void _XtPopup(
+    Widget      widget,
+    XtGrabKind  grab_kind,
+    _XtBoolean  spring_loaded)
+{
+    register ShellWidget shell_widget = (ShellWidget) widget;
+
+    if (! XtIsShell(widget)) {
+       XtAppErrorMsg(XtWidgetToApplicationContext(widget),
+               "invalidClass","xtPopup",XtCXtToolkitError,
+                "XtPopup requires a subclass of shellWidgetClass",
+                  (String *)NULL, (Cardinal *)NULL);
+    }
+
+    if (! shell_widget->shell.popped_up) {
+       XtGrabKind call_data = grab_kind;
+       XtCallCallbacks(widget, XtNpopupCallback, (XtPointer)&call_data);
+       shell_widget->shell.popped_up = TRUE;
+       shell_widget->shell.grab_kind = grab_kind;
+       shell_widget->shell.spring_loaded = spring_loaded;
+       if (shell_widget->shell.create_popup_child_proc != NULL) {
+           (*(shell_widget->shell.create_popup_child_proc))(widget);
+       }
+       if (grab_kind == XtGrabExclusive) {
+           XtAddGrab(widget, TRUE, spring_loaded);
+       } else if (grab_kind == XtGrabNonexclusive) {
+           XtAddGrab(widget, FALSE, spring_loaded);
+       }
+       XtRealizeWidget(widget);
+       XMapRaised(XtDisplay(widget), XtWindow(widget));
+    } else
+       XRaiseWindow(XtDisplay(widget), XtWindow(widget));
+
+} /* _XtPopup */
+
+void XtPopup (Widget widget, XtGrabKind grab_kind)
+{
+    Widget hookobj;
+
+    switch (grab_kind) {
+
+      case XtGrabNone:
+      case XtGrabExclusive:
+      case XtGrabNonexclusive:
+       break;
+
+      default:
+       XtAppWarningMsg(
+               XtWidgetToApplicationContext(widget),
+               "invalidGrabKind","xtPopup",XtCXtToolkitError,
+               "grab kind argument has invalid value; XtGrabNone assumed",
+               (String *)NULL, (Cardinal *)NULL);
+       grab_kind = XtGrabNone;
+    }
+
+    _XtPopup(widget, grab_kind, FALSE);
+
+    hookobj = XtHooksOfDisplay(XtDisplay(widget));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+       XtChangeHookDataRec call_data;
+
+       call_data.type = XtHpopup;
+       call_data.widget = widget;
+       call_data.event_data = (XtPointer)grab_kind;
+       XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.changehook_callbacks,
+               (XtPointer)&call_data);
+    }
+} /* XtPopup */
+
+void XtPopupSpringLoaded (
+    Widget widget)
+{
+    Widget hookobj;
+
+    _XtPopup(widget, XtGrabExclusive, True);
+
+    hookobj = XtHooksOfDisplay(XtDisplay(widget));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+       XtChangeHookDataRec call_data;
+
+       call_data.type = XtHpopupSpringLoaded;
+       call_data.widget = widget;
+       XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.changehook_callbacks,
+               (XtPointer)&call_data);
+    }
+}
+
+void XtPopdown(
+    Widget  widget)
+{
+    /* Unmap a shell widget if it is mapped, and remove from grab list */
+    Widget hookobj;
+    ShellWidget shell_widget = (ShellWidget) widget;
+    XtGrabKind grab_kind;
+
+    if (! XtIsShell(widget)) {
+       XtAppErrorMsg(XtWidgetToApplicationContext(widget),
+               "invalidClass","xtPopdown",XtCXtToolkitError,
+            "XtPopdown requires a subclass of shellWidgetClass",
+              (String *)NULL, (Cardinal *)NULL);
+    }
+
+#ifndef X_NO_XT_POPDOWN_CONFORMANCE
+    if (!shell_widget->shell.popped_up)
+        return;
+#endif
+
+    grab_kind = shell_widget->shell.grab_kind;
+    XWithdrawWindow(XtDisplay(widget), XtWindow(widget),
+                   XScreenNumberOfScreen(XtScreen(widget)));
+    if (grab_kind != XtGrabNone)
+       XtRemoveGrab(widget);
+    shell_widget->shell.popped_up = FALSE;
+    XtCallCallbacks(widget, XtNpopdownCallback, (XtPointer)&grab_kind);
+
+    hookobj = XtHooksOfDisplay(XtDisplay(widget));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+       XtChangeHookDataRec call_data;
+
+       call_data.type = XtHpopdown;
+       call_data.widget = widget;
+       XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.changehook_callbacks,
+               (XtPointer)&call_data);
+    }
+} /* XtPopdown */
+
+/* ARGSUSED */
+void XtCallbackPopdown(
+    Widget  widget,
+    XtPointer closure,
+    XtPointer call_data)
+{
+    register XtPopdownID id = (XtPopdownID) closure;
+
+    XtPopdown(id->shell_widget);
+    if (id->enable_widget != NULL) {
+       XtSetSensitive(id->enable_widget, TRUE);
+    }
+} /* XtCallbackPopdown */
diff --git a/src/PopupCB.c b/src/PopupCB.c
new file mode 100644 (file)
index 0000000..38cba26
--- /dev/null
@@ -0,0 +1,82 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+
+/* ARGSUSED */
+void XtCallbackNone(
+    Widget  widget,
+    XtPointer closure,
+    XtPointer call_data)
+{
+    XtSetSensitive(widget, FALSE);
+    _XtPopup((Widget) closure, XtGrabNone, FALSE);
+} /* XtCallbackNone */
+
+/* ARGSUSED */
+void XtCallbackNonexclusive(
+    Widget  widget,
+    XtPointer closure,
+    XtPointer call_data)
+{
+
+    XtSetSensitive(widget, FALSE);
+    _XtPopup((Widget) closure, XtGrabNonexclusive, FALSE);
+} /* XtCallbackNonexclusive */
+
+/* ARGSUSED */
+void XtCallbackExclusive(
+    Widget  widget,
+    XtPointer closure,
+    XtPointer call_data)
+{
+    XtSetSensitive(widget, FALSE);
+    _XtPopup((Widget) closure, XtGrabExclusive, FALSE);
+} /* XtCallbackExclusive */
diff --git a/src/RectObj.c b/src/RectObj.c
new file mode 100644 (file)
index 0000000..73e9625
--- /dev/null
@@ -0,0 +1,190 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+#include "CreateI.h"
+
+/******************************************************************
+ *
+ * Rectangle Object Resources
+ *
+ ******************************************************************/
+
+static void XtCopyAncestorSensitive(Widget, int, XrmValue *);
+
+static XtResource resources[] = {
+
+    {XtNancestorSensitive, XtCSensitive, XtRBoolean, sizeof(Boolean),
+      XtOffsetOf(RectObjRec,rectangle.ancestor_sensitive),XtRCallProc,
+      (XtPointer)XtCopyAncestorSensitive},
+    {XtNx, XtCPosition, XtRPosition, sizeof(Position),
+         XtOffsetOf(RectObjRec,rectangle.x), XtRImmediate, (XtPointer)0},
+    {XtNy, XtCPosition, XtRPosition, sizeof(Position),
+         XtOffsetOf(RectObjRec,rectangle.y), XtRImmediate, (XtPointer)0},
+    {XtNwidth, XtCWidth, XtRDimension, sizeof(Dimension),
+         XtOffsetOf(RectObjRec,rectangle.width), XtRImmediate, (XtPointer)0},
+    {XtNheight, XtCHeight, XtRDimension, sizeof(Dimension),
+         XtOffsetOf(RectObjRec,rectangle.height), XtRImmediate, (XtPointer)0},
+    {XtNborderWidth, XtCBorderWidth, XtRDimension, sizeof(Dimension),
+         XtOffsetOf(RectObjRec,rectangle.border_width), XtRImmediate,
+        (XtPointer)1},
+    {XtNsensitive, XtCSensitive, XtRBoolean, sizeof(Boolean),
+         XtOffsetOf(RectObjRec,rectangle.sensitive), XtRImmediate,
+        (XtPointer)True}
+    };
+
+static void RectClassPartInitialize(WidgetClass);
+static void RectSetValuesAlmost(Widget, Widget, XtWidgetGeometry *, XtWidgetGeometry *);
+
+externaldef(rectobjclassrec) RectObjClassRec rectObjClassRec = {
+  {
+    /* superclass        */    (WidgetClass)&objectClassRec,
+    /* class_name        */    "Rect",
+    /* widget_size       */    sizeof(RectObjRec),
+    /* class_initialize   */    NULL,
+    /* class_part_initialize*/ RectClassPartInitialize,
+    /* class_inited       */   FALSE,
+    /* initialize        */    NULL,
+    /* initialize_hook    */   NULL,
+    /* realize           */    NULL,
+    /* actions           */    NULL,
+    /* num_actions       */    0,
+    /* resources         */    resources,
+    /* num_resources     */    XtNumber(resources),
+    /* xrm_class         */    NULLQUARK,
+    /* compress_motion   */    FALSE,
+    /* compress_exposure  */   TRUE,
+    /* compress_enterleave*/   FALSE,
+    /* visible_interest          */    FALSE,
+    /* destroy           */    NULL,
+    /* resize            */    NULL,
+    /* expose            */    NULL,
+    /* set_values        */    NULL,
+    /* set_values_hook    */   NULL,
+    /* set_values_almost  */   RectSetValuesAlmost,
+    /* get_values_hook    */   NULL,
+    /* accept_focus      */    NULL,
+    /* version           */    XtVersion,
+    /* callback_offsets   */    NULL,
+    /* tm_table           */    NULL,
+    /* query_geometry      */  NULL,
+    /* display_accelerator  */ NULL,
+    /* extension           */  NULL
+  }
+};
+
+externaldef(rectObjClass)
+WidgetClass rectObjClass = (WidgetClass)&rectObjClassRec;
+
+/*ARGSUSED*/
+static void XtCopyAncestorSensitive(
+    Widget      widget,
+    int                offset,
+    XrmValue    *value)
+{
+    static Boolean  sensitive;
+    Widget parent = widget->core.parent;
+
+    sensitive = (parent->core.ancestor_sensitive & parent->core.sensitive);
+    value->addr = (XPointer)(&sensitive);
+}
+
+
+/*
+ * Start of rectangle object methods
+ */
+
+
+static void RectClassPartInitialize(
+    register WidgetClass wc)
+{
+    register RectObjClass roc = (RectObjClass)wc;
+    register RectObjClass super = ((RectObjClass)roc->rect_class.superclass);
+
+    /* We don't need to check for null super since we'll get to object
+       eventually, and it had better define them!  */
+
+
+    if (roc->rect_class.resize == XtInheritResize) {
+       roc->rect_class.resize = super->rect_class.resize;
+    }
+
+    if (roc->rect_class.expose == XtInheritExpose) {
+       roc->rect_class.expose = super->rect_class.expose;
+    }
+
+    if (roc->rect_class.set_values_almost == XtInheritSetValuesAlmost) {
+       roc->rect_class.set_values_almost = super->rect_class.set_values_almost;
+    }
+
+
+    if (roc->rect_class.query_geometry == XtInheritQueryGeometry) {
+       roc->rect_class.query_geometry = super->rect_class.query_geometry;
+    }
+}
+
+/*
+ * Why there isn't an Initialize Method:
+ *
+ * Initialization of the RectObj non-Resource field is done by the
+ * intrinsics in _XtCreateWidget in order that the field is initialized
+ * for use by converters during instance resource resolution.
+ */
+
+/*ARGSUSED*/
+static void RectSetValuesAlmost(
+    Widget             old,
+    Widget             new,
+    XtWidgetGeometry    *request,
+    XtWidgetGeometry    *reply)
+{
+    *request = *reply;
+}
diff --git a/src/ResConfig.c b/src/ResConfig.c
new file mode 100644 (file)
index 0000000..68da536
--- /dev/null
@@ -0,0 +1,999 @@
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+/*****************************************************************
+
+(C) COPYRIGHT International Business Machines Corp. 1992,1997
+    All Rights Reserved
+
+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.
+
+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 IBM CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
+BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL 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 IBM Corporation 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 IBM
+Corporation.
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Intrinsic.h"
+#include "IntrinsicI.h"
+#include "Core.h"
+#include "CoreP.h"
+#include "ShellP.h"
+#include "StringDefs.h"
+#include "ResConfigP.h"
+#include <X11/Xatom.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define MAX_BUFFER 512
+
+static void _search_child(Widget, char *, char *, char *, char *, char, char *);
+static void _set_and_search(Widget, char *, char *, char *, char *, char , char *);
+static int _locate_children(Widget, Widget **);
+
+#if defined(sun) && !defined(SVR4)
+# define Strtoul(a,b,c) (unsigned long)strtol(a,b,c)
+#else
+# define Strtoul(a,b,c) strtoul(a,b,c)
+#endif
+
+
+/*
+ * NAME: _set_resource_values
+ *
+ * FUNCTION:
+ *     This function sets the value on the widget.  It must first determine
+ *     if the last part is a valid resource for that widget.  (eg.
+ *     labelString is a valid resource for label but not for bulletin board)
+ *     It must also add the resource to the application's resource database
+ *     and then query it out using specific resource strings that it builds
+ *     from the widget information.  This ensures that a customizing tool
+ *     on-the-fly paradigm is followed:  an application that is
+ *     instantaneously updated should look the same as one that is restarted
+ *     and uses the .Xdefaults file.
+ *
+ * PARAMETERS:
+ *     w               the widget to match
+ *     resource        the resource string to be matched
+ *     value           the value to be set
+ *     last_part       the last resource part (e.g. *background)
+ *
+ * RETURN VALUES: void
+ *
+ * ERRORS: none
+ */
+static void
+_set_resource_values (
+       Widget w,
+       char *resource,
+       char *value,
+       char *last_part)
+{
+       XrmDatabase     db = NULL;
+       char            *resource_name = NULL;
+       char            *resource_class = NULL;
+       char            *return_type;
+       XrmValue        return_value;
+       char            *resource_value;
+       Widget          cur = w;
+       char            *temp;
+       XtResourceList  resources_return = NULL;
+       Cardinal        num_resources_return = 0;
+       Cardinal        res_index;
+       Boolean         found_resource = False;
+       Display         *dpy;
+       XrmDatabase     tmp_db;
+
+       if (!XtIsWidget (w))
+               dpy = XtDisplay (w->core.parent);
+       else
+               dpy = XtDisplay (w);
+       tmp_db = XtDatabase(dpy);
+
+       /*
+        * get a list of all the valid resources for this widget
+        */
+       XtGetResourceList (w->core.widget_class,
+               &resources_return, &num_resources_return);
+
+       /*
+        * try to match the last_part of the resource string with
+        * a resource in this resource list
+        */
+       for (res_index=0; res_index<num_resources_return; res_index++) {
+               if ((strcmp (last_part,
+                       resources_return[res_index].resource_name) == 0) ||
+                   (strcmp (last_part,
+                       resources_return[res_index].resource_class) == 0)) {
+                       found_resource = True;
+                       break;
+               }
+       }
+
+       /*
+        * if resource is not a valid resource for this widget
+        * or the resource name or class are NULL
+        * then exit this function
+        */
+       if (!found_resource
+               || !resources_return[res_index].resource_name
+               || !resources_return[res_index].resource_class) {
+               XtFree ((char *) resources_return);
+               return;
+       }
+
+       /*
+        * build the full resource name and class specifications so
+        * that you can query the resource database
+        *      eg: .app.button1.foreground
+        *          .App.XmPushButton.Foreground
+        */
+       while (cur != NULL) {
+               /*
+                * create resource name string
+                */
+               if (resource_name) {
+                       XtAsprintf (&temp, ".%s%s", cur->core.name, resource_name);
+                       XtFree (resource_name);
+               } else if (!XtIsWidget (cur) || !cur->core.name) {
+                       cur = XtParent(cur);
+                       continue;
+               } else {
+                       XtAsprintf (&temp, ".%s", cur->core.name);
+               }
+               resource_name = temp;
+
+               /*
+                * create resource class string
+                */
+               if ((XtIsTopLevelShell (cur)) && (XtParent (cur) == NULL)) {
+                       ApplicationShellWidget  top =
+                               (ApplicationShellWidget) (cur);
+
+                       if (resource_class) {
+                               XtAsprintf (&temp, ".%s%s",
+                                       top->application.class, resource_class);
+                       } else {
+                               XtAsprintf (&temp, ".%s",
+                                       top->application.class);
+                       }
+               } else {
+                       if (resource_class) {
+                               XtAsprintf (&temp, ".%s%s",
+                                       cur->core.widget_class->core_class.class_name,
+                                       resource_class);
+                       } else {
+                               XtAsprintf (&temp, ".%s",
+                                       cur->core.widget_class->core_class.class_name);
+                       }
+               }
+               if (resource_class != NULL)
+                       XtFree (resource_class);
+               resource_class = temp;
+
+               cur = XtParent(cur);
+       }
+
+       /*
+        * add the resource name to the end of the resource name string
+        */
+       XtAsprintf (&temp, "%s.%s", resource_name,
+               resources_return[res_index].resource_name);
+       if (resource_name != NULL)
+               XtFree (resource_name);
+       resource_name = temp;
+
+       /*
+        * add the resource class to the end of the resource class string
+        */
+       XtAsprintf (&temp, "%s.%s", resource_class,
+               resources_return[res_index].resource_class);
+       if (resource_class != NULL)
+               XtFree (resource_class);
+       resource_class = temp;
+
+#ifdef DEBUG
+       fprintf (stderr, "resource_name = %s\n", resource_name);
+       fprintf (stderr, "resource_class = %s\n", resource_class);
+#endif
+
+       /*
+        * put the resource and its value in a resource database and
+        * then query it back out again using the specific name and
+        * class resource strings that were built above.  This is
+        * necessary to maintain a precedence similar to the .Xdefaults
+        * file
+        */
+       XrmPutStringResource (&db, resource, value);
+       XrmMergeDatabases (db, &tmp_db);
+       XrmGetResource (tmp_db, resource_name, resource_class,
+               &return_type, &return_value);
+       if (return_type)
+               resource_value = XtNewString (return_value.addr);
+       else
+               resource_value = XtNewString (value);
+
+#ifdef DEBUG
+       fprintf (stderr,
+               "Apply:\n\twidget = %s\n\tlast_part = %s\n\tvalue = %s\n",
+               (w->core.name == NULL) ? "NULL" : w->core.name,
+               resources_return[res_index].resource_name,
+               resource_value);
+#endif
+       /*
+        * use XtVaSetValues with XtVaTypedArg to convert the value of
+        * type String the the same type as the resource (last_part).
+        * Then set the value.
+        */
+       XtVaSetValues (w,
+               XtVaTypedArg, resources_return[res_index].resource_name,
+               XtRString, resource_value,
+               strlen (resource_value) + 1,
+               NULL);
+
+       XtFree ((char *) resources_return);
+       XtFree (resource_name);
+       XtFree (resource_class);
+       XtFree (resource_value);
+}
+
+/*
+ * NAME: _apply_values_to_children
+ *
+ * FUNCTION:
+ *     Once the resource string matches the value must be applied to
+ *     all children if applicable. (eg. App*Form.background must apply
+ *     background to all children of the Form widget)
+ *
+ * PARAMETERS:
+ *     w               the widget to match
+ *     remainder       the part of the resource string left over
+ *     resource        the resource string to be matched
+ *     value           the value to be set
+ *     last_token      the last * or . before the final resoruce part
+ *     last_part       the last resource part (e.g. *background)
+ *
+ * RETURN VALUES: void
+ *
+ * ERRORS: none
+ */
+static void
+_apply_values_to_children (
+       Widget w,
+       char *remainder,
+       char *resource,
+       char *value,
+       char last_token,
+       char *last_part)
+{
+       int     i;
+       int     num_children;
+       Widget  *children;
+
+       /*
+        * Recursively search through the children
+        */
+       num_children = _locate_children (w, &children);
+
+       for (i=0; i<num_children; i++) {
+
+#ifdef DEBUG
+               if (XtIsWidget (children[i]) && XtIsWidget (w))
+                       fprintf (stderr, "searching child %s of parent %s\n",
+                               children[i]->core.name, w->core.name);
+               else
+                       fprintf (stderr,"searching child (NULL) of parent %s\n",
+                               w->core.name);
+               if (!XtIsWidget (children[i]))
+                       fprintf (stderr, "children[%d] is NOT a widget\n", i);
+               if (!XtIsWidget (w))
+                       fprintf (stderr, "w is NOT a widget\n");
+#endif
+
+               _set_resource_values (children[i], resource, value, last_part);
+               _apply_values_to_children (children[i], remainder,
+                               resource, value, last_token, last_part);
+       }
+
+       XtFree ((char *)children);
+}
+
+/*
+ * NAME: _search_child
+ *
+ * FUNCTION:
+ *     descends through each child of the tree
+ *
+ * PARAMETERS:
+ *     w               the widget whose children are to be searched
+ *     indx            index into the resource string
+ *     remainder       the remaining part of the resource string
+ *     resource        the resource string to be matched
+ *     value           the value to be applied
+ *     last_token      the last * or . before the final resoruce part
+ *     last_part       the last resource part (e.g. *background)
+ *
+ * RETURN VALUES: none
+ *
+ * ERRORS: none
+ */
+static void
+_search_child (
+       Widget w,
+       char *indx,
+       char *remainder,
+       char *resource,
+       char *value,
+       char last_token,
+       char *last_part)
+{
+       int     i;
+       int     num_children;
+       Widget  *children;
+
+       /*
+        * Recursively search through the children
+        */
+       num_children = _locate_children (w, &children);
+       for (i=0; i<num_children; i++) {
+               _set_and_search (children[i], indx, remainder, resource,
+                       value, last_token, last_part);
+       }
+
+       XtFree ((char *)children);
+}
+
+/*
+ * NAME: _get_part
+ *
+ * FUNCTION:
+ *     This routine will return the token and following part of the resource
+ *     when given the current index it will update the index accordingly
+ *
+ * PARAMETERS:
+ *     remainder       the part of the resource string left over
+ *     indx            the index into the resource string
+ *     part            the parsed off part of the resource string
+ *
+ * RETURN VALUES:
+ *     char            the token (* or . or ?) preceding the resource part
+ *     indx            the index into the resource string
+ *     part            the parsed off part of the resource string
+ *
+ * ERRORS: none
+ */
+/* ARGSUSED */
+static char
+_get_part (
+       char *remainder,
+       char **indx,
+       char **part)
+{
+       char    buffer[MAX_BUFFER];
+       char    *buf_ptr;
+       char    token = **indx;
+       int     i = 0;
+
+       /*
+        * copy the remainder part into the buffer
+        */
+       buf_ptr = buffer;
+       (*indx)++;                      /* get rid of the token         */
+       while (**indx && (**indx != '.') && (**indx != '*')) {
+               *buf_ptr++ = *(*indx)++;
+               if (++i >= MAX_BUFFER - 1)
+                       break;
+       }
+       *buf_ptr = '\0';
+
+       *part = XtNewString (buffer);   /* return a new string to part  */
+
+       if (strcmp (*indx, "") == 0)
+               *indx = NULL;
+
+       return (token);                 /* return the token             */
+}
+
+/*
+ * NAME: _match_resource_to_widget
+ *
+ * FUNCTION:
+ *     This function matches the resource part to the widget name or class
+ *
+ * PARAMETERS:
+ *     w               the widget to match
+ *     part            the parsed off part of the resource string
+ *
+ * RETURN VALUES:
+ *     Boolean         true if a match occurs
+ *
+ * ERRORS: none
+ */
+static Boolean
+_match_resource_to_widget (
+       Widget w,
+       char *part)
+{
+       /*
+        * Match any widget at this level if the ? is used
+        */
+       if (strcmp (part, "?") == 0)
+               return (True);
+
+       /*
+        * if the object is really a widget then its name can be matched
+        * otherwise only use its class.  Note that if you try to reference
+        * a widget name when the object is not a widget, you may get a
+        * core dump from an invalid pointer reference.
+        */
+       if (XtIsWidget (w)) {
+               if ((strcmp (w->core.name, part) == 0) ||
+                   (strcmp (w->core.widget_class->core_class.class_name,
+                                                       part) == 0))
+                       return (True);
+               else
+                       return (False);
+       } else {
+               if ((strcmp (w->core.widget_class->core_class.class_name,
+                                                       part) == 0))
+                       return (True);
+               else
+                       return (False);
+       }
+}
+
+/*
+ * NAME: _set_and_search
+ *
+ * FUNCTION:
+ *     The algorithm to search the widget tree and apply a resource string
+ *
+ * PARAMETERS:
+ *     w               the widget to match
+ *     indx            the index into the resource string
+ *     remainder       the part of the resource string left over
+ *     resource        the resource string to be matched
+ *     value           the value to be set
+ *     last_token      the last * or . before the final resoruce part
+ *     last_part       the last resource part (e.g. *background)
+ *
+ * RETURN VALUES: none
+ *
+ * ERRORS: none
+ *
+ * ALGORITHM:
+ * loop (look at all children)
+ *     if (resource segment and current widget match)
+ *             if '.'
+ *                     if at end of resource string
+ *                             set values (    .=over all children
+ *                                             *=this widget only)
+ *                     else
+ *                             descend the widget tree
+ *                             and parse off resource segment
+ *                     exit the loop
+ *             if '*'
+ *                     if at end of resource string
+ *                             set values (    .=over all children
+ *                                             *=this widget only)
+ *                     descend and parse
+ *     else
+ *             if '.'
+ *                     continue looping
+ *             if '*'
+ *                     descend but don't parse
+ *                     continue looping
+ * end loop
+ *
+ * NOTE:  the _set_resource_values routine will not allow a value to be
+ *     set on a resource against the rules of the resource database manager
+ */
+static void
+_set_and_search (
+       Widget w,
+       char *indx,
+       char *remainder,
+       char *resource,
+       char *value,
+       char last_token,
+       char *last_part)
+{
+       char    *part;
+       char    *local_index = indx;
+       char    token;
+
+       /*
+        * parse off one part, return token and the new index
+        */
+       token = _get_part (remainder, &local_index, &part);
+
+       if (_match_resource_to_widget (w, part)) {
+               if (token == '.') {
+                       if (local_index == NULL) {
+                               if (last_token == '.') {
+                                       _set_resource_values (w, resource,
+                                               value, last_part);
+                               } else if (last_token == '*') {
+                                       _set_resource_values (w, resource,
+                                               value, last_part);
+                                       _apply_values_to_children (w,
+                                               remainder, resource, value,
+                                               last_token, last_part);
+                               }
+                       } else
+                               _search_child (w, local_index, remainder,
+                                       resource, value, last_token, last_part);
+                       return;
+               }
+               if (token == '*') {
+                       if (local_index == NULL) {
+                               if (last_token == '.') {
+                                       _set_resource_values (w, resource,
+                                               value, last_part);
+                               } else if (last_token == '*') {
+                                       _set_resource_values (w, resource,
+                                               value, last_part);
+                                       _apply_values_to_children ( w,
+                                               remainder, resource, value,
+                                               last_token, last_part);
+                               }
+                       } else
+                               _search_child (w, local_index, remainder,
+                                       resource, value, last_token, last_part);
+               }
+       } else {/* if the widget name and class don't match the part */
+               /* if (token == '.') just continue looping */
+
+               if (token == '*') {
+                       _search_child (w, indx, remainder, resource, value,
+                               last_token, last_part);
+               }
+       }
+
+       XtFree (part);
+}
+
+/*
+ * NAME: _get_last_part
+ *
+ * FUNCTION:
+ *     This routine will parse off the last segment of a resource string
+ *     and its token and return them.  the remainder of resource is also
+ *     returned.  strcoll is used to guarantee no problems with
+ *     international strings.
+ *
+ * PARAMETERS:
+ *     remainder       the part of the resource string left over
+ *     part            the parsed off part of the resource string
+ *
+ * RETURN VALUES:
+ *     char            the token (* or . or ?) preceding the resource part
+ *     remainder       the part of the resource string left over
+ *     part            the parsed off part of the resource string
+ *
+ * ERRORS: none
+ */
+static char
+_get_last_part (
+       char *remainder,
+       char **part)
+{
+       char    *loose, *tight;
+
+       loose = strrchr (remainder, '*');
+       tight = strrchr (remainder, '.');
+
+       if ((loose == NULL) && (tight == NULL)) {
+               *part = XtNewString (remainder);
+               return ('.');
+       }
+       if ((loose == NULL) || (tight && (strcoll (loose, tight) < 0))) {
+               *tight++ = '\0';        /* shorten the remainder string */
+               *part = XtNewString (tight);
+               return ('.');
+       }
+       if ((tight == NULL) || (loose && (strcoll (tight, loose) < 0))) {
+               *loose++ = '\0';
+               *part = XtNewString (loose);
+               return ('*');
+       }
+       *part = NULL;
+
+       return ('0');   /* error - return 0 */
+}
+
+/*
+ * NAME: _search_widget_tree
+ *
+ * FUNCTION:
+ *     This function tries to match a resource string to the widgets
+ *     it applies to.  The functions it invokes to do this then set
+ *     the value for that resource to each widget.
+ *
+ *     The resource string has to be parsed into the following format:
+ *             resource = App*Form*button1.background
+ *             remainder = *Form*button1
+ *             last_part = background          last_token = .
+ *     As the widget tree is recursively descended, these variables are
+ *     passed.  The remainder is parsed at each level in the widget
+ *     tree as the _set_and_search function attempts to match
+ *     the resource part (eg. part = Form  token = *) to a widget.  When
+ *     the entire resource string has been matched, the _set_resource_values
+ *     functions is called to apply the value to the widget or widgets.
+ *
+ * PARAMETERS:
+ *     w               a widget from whose toplevel shell ancestor
+ *                     the search will start
+ *     resource        the resource string to match
+ *     value           the value to apply
+ *
+ * RETURN VALUES: none
+ *
+ * ERRORS: none
+ */
+static void
+_search_widget_tree (
+       Widget w,
+       char *resource,
+       char *value)
+{
+       Widget  parent = w;
+       char    *last_part;
+       char    *remainder = NULL;
+       char    last_token;
+       char    *indx, *copy;
+       char    *loose, *tight;
+       int     loose_len, tight_len;
+
+       /*
+        * Find the root of the tree given any widget
+        */
+       while (XtParent(parent) != NULL) {
+               parent = XtParent(parent);
+       }
+#ifdef DEBUG
+       if (XtIsWidget (w) && XtIsWidget (parent))
+               fprintf (stderr, "widget = %s parent = %s\n",
+                       w->core.name, parent->core.name);
+       else
+               fprintf (stderr, "widget = NULL parent = NULL\n");
+#endif
+
+       /*
+        * parse off the Class name that was prepended to this string in
+        * a customizing tool
+        */
+       loose = strchr (resource, '*');
+       tight = strchr (resource, '.');
+       if ((loose == NULL) && (tight == NULL))
+               return;
+
+       loose_len = (loose) ? strlen (loose) : 0;
+       tight_len = (tight) ? strlen (tight) : 0;
+
+       if ((loose == NULL) || (tight_len > loose_len))
+               remainder = XtNewString (tight);
+       else if ((tight == NULL) || (loose_len > tight_len))
+               remainder = XtNewString (loose);
+
+       /*
+        * Parse last segment off of resource string, (eg. background, font,
+        * etc.)
+        */
+       last_token = _get_last_part (remainder, &last_part);
+       /*
+        * this case covers resources of only one level (eg. *background)
+        */
+       if (remainder[0] == 0) {
+               _set_resource_values (w, resource, value, last_part);
+               if (last_token == '*')
+                       _apply_values_to_children (parent, remainder, resource,
+                               value, last_token, last_part);
+       /*
+        * all other resource strings are recursively applied to the widget tree.
+        * Prepend a '.' to the remainder string if there is no leading token.
+        */
+       } else {
+               if (remainder[0] != '*' && remainder[0] != '.') {
+                       XtAsprintf (&copy, ".%s", remainder);
+                       XtFree (remainder);
+                       remainder = copy;
+               }
+               indx = remainder;
+               _set_and_search (parent, indx, remainder, resource, value,
+                       last_token, last_part);
+       }
+
+       XtFree (remainder);
+       XtFree (last_part);
+}
+
+/*
+ * NAME: _locate_children
+ *
+ * FUNCTION:
+ *     returns a list of all of a widget's children
+ *
+ * PARAMETERS:
+ *     w               the parent to search for its children
+ *     children        the list of children that is created
+ *     normal          flag for normal children
+ *     popup           flag for popup children
+ *
+ * RETURN VALUES:
+ *     int             the number of children
+ *     children        the list of children found
+ *
+ * ERRORS: none
+ */
+static int
+_locate_children (
+       Widget parent,
+       Widget **children)
+{
+       CompositeWidget comp = (CompositeWidget) parent;
+       Cardinal        i;
+       int     num_children = 0;
+       int     current = 0;
+
+       /*
+        * count the number of children
+        */
+       if (XtIsWidget (parent))
+               num_children += parent->core.num_popups;
+       if (XtIsComposite (parent))
+               num_children += comp->composite.num_children;
+       if (num_children == 0) {
+               *children = NULL;
+               return (0);
+       }
+
+       *children = (Widget *)
+               XtMalloc ((Cardinal) sizeof(Widget) * num_children);
+
+       if (XtIsComposite (parent)) {
+               for (i=0; i<comp->composite.num_children; i++) {
+                       (*children)[current] = comp->composite.children[i];
+                       current++;
+               }
+       }
+
+       if (XtIsWidget (parent)) {
+               for (i=0; i<parent->core.num_popups; i++) {
+                       (*children)[current] = comp->core.popup_list[i];
+                       current++;
+               }
+       }
+
+       return (num_children);
+}
+
+#ifdef DEBUG
+/*
+ * NAME: dump_widget_tree
+ *
+ * FUNCTION:
+ *     recursively printout entire widget tree
+ *
+ * PARAMETERS:
+ *     w               the widget to match
+ *     indent          the amount to indent each line
+ *
+ * RETURN VALUES: void
+ *
+ * ERRORS: none
+ */
+static void
+dump_widget_tree (
+       Widget w,
+       int     indent)
+{
+       int     i,j;
+       int     num_children;
+       Widget  *children;
+
+       /*
+        * Recursively search through the children
+        */
+       num_children = _locate_children (w, &children);
+       indent += 2;
+       for (i=0; i<num_children; i++) {
+               if (children[i] != NULL) {
+                       for (j=0; j<indent; j++)
+                               fprintf (stderr, " ");
+                       if (XtIsWidget (children[i])) {
+                               fprintf (stderr, "(%s)\t",children[i]->core.name);
+                               fprintf (stderr, "(%s)\n",
+                       children[i]->core.widget_class->core_class.class_name);
+                       } else {
+                               fprintf (stderr, "(NULL)\t");
+                               fprintf (stderr, "(%s)\n",
+                       children[i]->core.widget_class->core_class.class_name);
+                       }
+               }
+               dump_widget_tree (children[i], indent);
+       }
+
+       XtFree ((char *)children);
+}
+#endif
+
+/*
+ * NAME: _XtResourceConfiguationEH
+ *
+ * FUNCTION:
+ *     This function is the event handler for the on-the-fly communication
+ *     with a resource customization tool.  This event handler must be
+ *      registered for the toplevel shell of each app.  This is best done
+ *      in the _XtCreatePopupShell and _XtAppCreateShell functions in Xt's
+ *     Create.c source file.
+ *
+ *     The property used to communicate with a customizing tool is
+ *     placed on the toplevel shell window of the application.  The
+ *     customizing tool places a property on this window which causes
+ *     this event handler to be invoked via the PropertyNotify event.
+ *     This event handler reads the property and then deletes it from
+ *     the server.  The contents of the property are a resource string
+ *     and value.  The event handler then calls functions to walk the
+ *     applications widget tree, determining which widgets are affected
+ *     by the resource string, and then applying the value with XtSetValues.
+ *
+ * PARAMETERS:
+ *     w               the widget that invoked this event handler
+ *     client_data     not used
+ *     event           the event structure
+ *
+ * RETURN VALUES: none
+ *
+ * ERRORS: none
+ */
+/* ARGSUSED */
+void
+_XtResourceConfigurationEH (
+       Widget w,
+       XtPointer client_data,
+       XEvent *event)
+{
+       Atom            actual_type;
+       int             actual_format;
+       unsigned long   nitems;
+       unsigned long   leftover;
+       unsigned char   *data = NULL;
+       unsigned long   resource_len;
+       char            *data_ptr;
+       char            *resource;
+       char            *value;
+#ifdef DEBUG
+       int             indent = 0;
+#endif
+       XtPerDisplay    pd;
+
+#ifdef DEBUG
+       fprintf (stderr, "in _XtResourceConfiguationEH atom = %d\n",event->xproperty.atom);
+       fprintf (stderr, "    window = %x\n", XtWindow (w));
+       if (XtIsWidget (w))
+               fprintf (stderr, "    widget = %x   name = %s\n", w, w->core.name);
+#endif
+
+       pd = _XtGetPerDisplay (XtDisplay (w));
+
+       /*
+        * The window on which a customizing tool places the property
+        * is determined at this point.  It should be the applications
+        * toplevel shell window.
+        *
+        * A customizing tool sends a "ping" to the application on
+        * the RCM_INIT property.  The application answers the ping
+        * by deleting the property.
+        */
+       if (event->xproperty.atom == pd->rcm_init) {
+               XDeleteProperty (XtDisplay(w), XtWindow (w), pd->rcm_init);
+
+#ifdef DEBUG
+               if (XtIsWidget (w))
+                       fprintf (stderr, "%s\n", w->core.name);
+               else
+                       fprintf (stderr, "NULL name\n");
+               dump_widget_tree(w, indent);
+
+               fprintf (stderr, "answer ping\n");
+#endif
+       }
+
+       /*
+        * This event handler ignores any property notify events that
+        * are not RCM_INIT or RCM_DATA
+        */
+       if (event->xproperty.atom != pd->rcm_data)
+               return;
+
+       /*
+        * Retrieve the data from the property
+        */
+#ifdef DEBUG
+       fprintf (stderr, "receiving RCM_DATA property\n");
+#endif
+       if (XGetWindowProperty (XtDisplay(w),
+               XtWindow (w),
+               pd->rcm_data, 0L, 8192L,
+               TRUE, XA_STRING,
+               &actual_type, &actual_format, &nitems, &leftover,
+               &data ) == Success && actual_type == XA_STRING
+                          && actual_format == 8) {
+       /*
+        *      data format is:
+        *
+        *      resource_length, resource, value
+        *
+        *      convert the resource_length to a long, skip over it, put a
+        *      zero byte at the end of the resource, and pick off the
+        *      resource and value fields.
+        */
+               if (data) {
+                       resource_len = Strtoul ((void *)data, &data_ptr, 10);
+                       data_ptr++;
+
+                       data_ptr[resource_len] = '\0';
+
+                       resource = XtNewString (data_ptr);
+                       value = XtNewString (&data_ptr[resource_len + 1]);
+#ifdef DEBUG
+                       fprintf (stderr, "resource_len=%d\n",resource_len);
+                       fprintf (stderr, "resource = %s\t value = %s\n",
+                                       resource, value);
+#endif
+                       /*
+                        * descend the application widget tree and
+                        * apply the value to the appropriate widgets
+                        */
+                       _search_widget_tree (w, resource, value);
+
+                       XtFree (resource);
+                       XtFree (value);
+               }
+       }
+
+       if (data)
+               XFree ((char *)data);
+}
diff --git a/src/Resources.c b/src/Resources.c
new file mode 100644 (file)
index 0000000..1d2871c
--- /dev/null
@@ -0,0 +1,1190 @@
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+/*LINTLIBRARY*/
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "VarargsI.h"
+#include "Shell.h"
+#include "ShellP.h"
+#include "StringDefs.h"
+#include <stdio.h>
+
+static XrmClass        QBoolean, QString, QCallProc, QImmediate;
+static XrmName QinitialResourcesPersistent, QInitialResourcesPersistent;
+static XrmClass QTranslations, QTranslationTable;
+static XrmName Qtranslations, QbaseTranslations;
+static XrmName Qscreen;
+static XrmClass QScreen;
+
+#ifdef CRAY
+void Cjump();
+char *Cjumpp = (char *) Cjump;
+void Cjump() {}
+#endif
+
+void _XtCopyFromParent(
+    Widget      widget,
+    int                offset,
+    XrmValue    *value)
+{
+    if (widget->core.parent == NULL) {
+       XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+               "invalidParent","xtCopyFromParent",XtCXtToolkitError,
+                  "CopyFromParent must have non-NULL parent",
+                 (String *)NULL, (Cardinal *)NULL);
+        value->addr = NULL;
+        return;
+    }
+    value->addr = (XPointer)(((char *)widget->core.parent) + offset);
+} /* _XtCopyFromParent */
+
+
+void _XtCopyFromArg(
+    XtArgVal src,
+    char* dst,
+    register unsigned int size)
+{
+    if (size > sizeof(XtArgVal))
+       (void) memmove((char *) dst, (char *)  src, (int) size);
+    else {
+       union {
+           long        longval;
+#ifdef LONG64
+           int         intval;
+#endif
+           short       shortval;
+           char        charval;
+           char*       charptr;
+           XtPointer   ptr;
+       } u;
+       char *p = (char*)&u;
+       if      (size == sizeof(long))      u.longval = (long)src;
+#ifdef LONG64
+       else if (size == sizeof(int))       u.intval = (int)src;
+#endif
+       else if (size == sizeof(short))     u.shortval = (short)src;
+       else if (size == sizeof(char))      u.charval = (char)src;
+       else if (size == sizeof(XtPointer)) u.ptr = (XtPointer)src;
+       else if (size == sizeof(char*))     u.charptr = (char*)src;
+       else                                p = (char*)&src;
+
+       (void) memmove(dst, p, (int) size);
+    }
+} /* _XtCopyFromArg */
+
+void _XtCopyToArg(
+    char* src,
+    XtArgVal *dst,
+    register unsigned int size)
+{
+    if (!*dst) {
+#ifdef GETVALUES_BUG
+       /* old GetValues semantics (storing directly into arglists) are bad,
+        * but preserve for compatibility as long as arglist contains NULL.
+        */
+       union {
+           long        longval;
+#ifdef LONG64
+           int         intval;
+#endif
+           short       shortval;
+           char        charval;
+           char*       charptr;
+           XtPointer   ptr;
+       } u;
+       if (size <= sizeof(XtArgVal)) {
+           (void) memmove((char*)&u, (char*)src, (int)size );
+           if      (size == sizeof(long))      *dst = (XtArgVal)u.longval;
+#ifdef LONG64
+           else if (size == sizeof(int))       *dst = (XtArgVal)u.intval;
+#endif
+           else if (size == sizeof(short))     *dst = (XtArgVal)u.shortval;
+           else if (size == sizeof(char))      *dst = (XtArgVal)u.charval;
+           else if (size == sizeof(char*))     *dst = (XtArgVal)u.charptr;
+           else if (size == sizeof(XtPointer)) *dst = (XtArgVal)u.ptr;
+           else (void) memmove((char*)dst, (char*)src, (int)size );
+       }
+       else
+           (void) memmove((char*)dst, (char*)src, (int)size );
+#else
+       XtErrorMsg("invalidGetValues", "xtGetValues", XtCXtToolkitError,
+           "NULL ArgVal in XtGetValues", (String*) NULL, (Cardinal*) NULL);
+#endif
+    }
+    else {
+       /* proper GetValues semantics: argval is pointer to destination */
+       (void) memmove((char*)*dst, (char*)src, (int)size );
+    }
+} /* _XtCopyToArg */
+
+static void CopyToArg(
+    char* src,
+    XtArgVal *dst,
+    register unsigned int size)
+{
+    if (!*dst) {
+       /* old GetValues semantics (storing directly into arglists) are bad,
+        * but preserve for compatibility as long as arglist contains NULL.
+        */
+       union {
+           long        longval;
+#ifdef LONG64
+           int         intval;
+#endif
+           short       shortval;
+           char        charval;
+           char*       charptr;
+           XtPointer   ptr;
+       } u;
+       if (size <= sizeof(XtArgVal)) {
+           (void) memmove((char*)&u, (char*)src, (int)size );
+           if      (size == sizeof(long))      *dst = (XtArgVal)u.longval;
+#ifdef LONG64
+           else if (size == sizeof(int))       *dst = (XtArgVal)u.intval;
+#endif
+           else if (size == sizeof(short))     *dst = (XtArgVal)u.shortval;
+           else if (size == sizeof(char))      *dst = (XtArgVal)u.charval;
+           else if (size == sizeof(char*))     *dst = (XtArgVal)u.charptr;
+           else if (size == sizeof(XtPointer)) *dst = (XtArgVal)u.ptr;
+           else (void) memmove((char*)dst, (char*)src, (int)size );
+       }
+       else
+           (void) memmove((char*)dst, (char*)src, (int)size );
+    }
+    else {
+       /* proper GetValues semantics: argval is pointer to destination */
+       (void) memmove((char*)*dst, (char*)src, (int)size );
+    }
+} /* CopyToArg */
+
+
+static Cardinal CountTreeDepth(
+    Widget w)
+{
+    Cardinal count;
+
+    for (count = 1; w != NULL; w = (Widget) w->core.parent)
+       count++;
+
+    return count;
+}
+
+static void GetNamesAndClasses(
+    register Widget      w,
+    register XrmNameList  names,
+    register XrmClassList classes)
+{
+    register Cardinal length, j;
+    register XrmQuark t;
+    WidgetClass class;
+
+    /* Return null-terminated quark arrays, with length the number of
+       quarks (not including NULL) */
+
+    LOCK_PROCESS;
+    for (length = 0; w != NULL; w = (Widget) w->core.parent) {
+       names[length] = w->core.xrm_name;
+       class = XtClass(w);
+       /* KLUDGE KLUDGE KLUDGE KLUDGE */
+       if (w->core.parent == NULL && XtIsApplicationShell(w)) {
+           classes[length] =
+               ((ApplicationShellWidget) w)->application.xrm_class;
+       } else classes[length] = class->core_class.xrm_class;
+       length++;
+     }
+    UNLOCK_PROCESS;
+    /* They're in backwards order, flop them around */
+    for (j = 0; j < length/2; j++) {
+       t = names[j];
+       names[j] = names[length-j-1];
+       names[length-j-1] = t;
+        t = classes[j];
+       classes[j] = classes[length-j-1];
+       classes[length-j-1] = t;
+    }
+    names[length] = NULLQUARK;
+    classes[length] = NULLQUARK;
+} /* GetNamesAndClasses */
+
+
+/* Spiffy fast compiled form of resource list.                         */
+/* XtResourceLists are compiled in-place into XrmResourceLists         */
+/* All atoms are replaced by quarks, and offsets are -offset-1 to      */
+/* indicate that this list has been compiled already                   */
+
+void _XtCompileResourceList(
+    register XtResourceList resources,
+            Cardinal       num_resources)
+{
+    register Cardinal count;
+
+#define xrmres  ((XrmResourceList) resources)
+#define PSToQ   XrmPermStringToQuark
+
+    for (count = 0; count < num_resources; resources++, count++) {
+       xrmres->xrm_name         = PSToQ(resources->resource_name);
+       xrmres->xrm_class        = PSToQ(resources->resource_class);
+       xrmres->xrm_type         = PSToQ(resources->resource_type);
+        xrmres->xrm_offset      = (Cardinal)
+               (-(int)resources->resource_offset - 1);
+       xrmres->xrm_default_type = PSToQ(resources->default_type);
+    }
+#undef PSToQ
+#undef xrmres
+} /* _XtCompileResourceList */
+
+/* Like _XtCompileResourceList, but strings are not permanent */
+static void  XrmCompileResourceListEphem(
+    register XtResourceList resources,
+            Cardinal       num_resources)
+{
+    register Cardinal count;
+
+#define xrmres  ((XrmResourceList) resources)
+
+    for (count = 0; count < num_resources; resources++, count++) {
+       xrmres->xrm_name         = StringToName(resources->resource_name);
+       xrmres->xrm_class        = StringToClass(resources->resource_class);
+       xrmres->xrm_type         = StringToQuark(resources->resource_type);
+        xrmres->xrm_offset      = (Cardinal)
+               (-(int)resources->resource_offset - 1);
+       xrmres->xrm_default_type = StringToQuark(resources->default_type);
+    }
+#undef xrmres
+} /* XrmCompileResourceListEphem */
+
+static void BadSize(
+    Cardinal size,
+    XrmQuark name)
+{
+    String params[2];
+    Cardinal num_params = 2;
+
+    params[0] = (String)(long) size;
+    params[1] = XrmQuarkToString(name);
+    XtWarningMsg("invalidSizeOverride", "xtDependencies", XtCXtToolkitError,
+       "Representation size %d must match superclass's to override %s",
+       params, &num_params);
+} /* BadType */
+
+/*
+ * Create a new resource list, with the class resources following the
+ * superclass's resources.  If a resource in the class list overrides
+ * a superclass resource, then just replace the superclass entry in place.
+ *
+ * At the same time, add a level of indirection to the XtResourceList to
+ * create and XrmResourceList.
+ */
+void _XtDependencies(
+    XtResourceList  *class_resp,       /* VAR */
+    Cardinal       *class_num_resp,    /* VAR */
+    XrmResourceList *super_res,
+    Cardinal       super_num_res,
+    Cardinal       super_widget_size)
+{
+    register XrmResourceList *new_res;
+            Cardinal        new_num_res;
+            XrmResourceList class_res = (XrmResourceList) *class_resp;
+            Cardinal        class_num_res = *class_num_resp;
+    register Cardinal       i, j;
+            Cardinal        new_next;
+
+    if (class_num_res == 0) {
+       /* Just point to superclass resource list */
+       *class_resp = (XtResourceList) super_res;
+       *class_num_resp = super_num_res;
+       return;
+    }
+
+    /* Allocate and initialize new_res with superclass resource pointers */
+    new_num_res = super_num_res + class_num_res;
+    new_res = (XrmResourceList *) __XtMalloc(new_num_res*sizeof(XrmResourceList));
+    if (super_num_res > 0)
+       XtMemmove(new_res, super_res, super_num_res * sizeof(XrmResourceList));
+
+    /* Put pointers to class resource entries into new_res */
+    new_next = super_num_res;
+    for (i = 0; i < class_num_res; i++) {
+       if ((Cardinal)(-class_res[i].xrm_offset-1) < super_widget_size) {
+           /* Probably an override of superclass resources--look for overlap */
+           for (j = 0; j < super_num_res; j++) {
+               if (class_res[i].xrm_offset == new_res[j]->xrm_offset) {
+                   /* Spec is silent on what fields subclass can override.
+                    * The only two of real concern are type & size.
+                    * Although allowing type to be over-ridden introduces
+                    * the possibility of errors, it's at present the only
+                    * reasonable way to allow a subclass to force a private
+                    * converter to be invoked for a subset of fields.
+                    */
+                   /* We do insist that size be identical to superclass */
+                   if (class_res[i].xrm_size != new_res[j]->xrm_size) {
+                       BadSize(class_res[i].xrm_size,
+                               (XrmQuark) class_res[i].xrm_name);
+                       class_res[i].xrm_size = new_res[j]->xrm_size;
+                   }
+                   new_res[j] = &(class_res[i]);
+                   new_num_res--;
+                   goto NextResource;
+               }
+           } /* for j */
+       }
+       /* Not an overlap, add an entry to new_res */
+       new_res[new_next++] = &(class_res[i]);
+NextResource:;
+    } /* for i */
+
+    /* Okay, stuff new resources back into class record */
+    *class_resp = (XtResourceList) new_res;
+    *class_num_resp = new_num_res;
+} /* _XtDependencies */
+
+
+void _XtResourceDependencies(
+    WidgetClass wc)
+{
+    WidgetClass sc;
+
+    sc = wc->core_class.superclass;
+    if (sc == NULL) {
+       _XtDependencies(&(wc->core_class.resources),
+                       &(wc->core_class.num_resources),
+                       (XrmResourceList *) NULL, (unsigned)0, (unsigned)0);
+    } else {
+       _XtDependencies(&(wc->core_class.resources),
+                       &(wc->core_class.num_resources),
+                       (XrmResourceList *) sc->core_class.resources,
+                       sc->core_class.num_resources,
+                       sc->core_class.widget_size);
+    }
+} /* _XtResourceDependencies */
+
+void _XtConstraintResDependencies(
+    ConstraintWidgetClass wc)
+{
+    ConstraintWidgetClass sc;
+
+    if (wc == (ConstraintWidgetClass) constraintWidgetClass) {
+       _XtDependencies(&(wc->constraint_class.resources),
+                       &(wc->constraint_class.num_resources),
+                       (XrmResourceList *)NULL, (unsigned)0, (unsigned)0);
+    } else {
+       sc = (ConstraintWidgetClass) wc->core_class.superclass;
+       _XtDependencies(&(wc->constraint_class.resources),
+                       &(wc->constraint_class.num_resources),
+                       (XrmResourceList *) sc->constraint_class.resources,
+                       sc->constraint_class.num_resources,
+                       sc->constraint_class.constraint_size);
+    }
+} /* _XtConstraintResDependencies */
+
+
+
+
+XrmResourceList* _XtCreateIndirectionTable (
+    XtResourceList  resources,
+    Cardinal       num_resources)
+{
+    register Cardinal idx;
+    XrmResourceList* table;
+
+    table = (XrmResourceList*)__XtMalloc(num_resources * sizeof(XrmResourceList));
+    for (idx = 0; idx < num_resources; idx++)
+        table[idx] = (XrmResourceList)(&(resources[idx]));
+    return table;
+}
+
+static XtCacheRef *GetResources(
+    Widget         widget,         /* Widget resources are associated with */
+    char*          base,           /* Base address of memory to write to   */
+    XrmNameList     names,         /* Full inheritance name of widget      */
+    XrmClassList    classes,       /* Full inheritance class of widget     */
+    XrmResourceList*  table,       /* The list of resources required.      */
+    unsigned       num_resources,  /* number of items in resource list     */
+    XrmQuarkList    quark_args,     /* Arg names quarkified                */
+    ArgList        args,           /* ArgList to override resources        */
+    unsigned       num_args,       /* number of items in arg list          */
+    XtTypedArgList  typed_args,            /* Typed arg list to override resources */
+    Cardinal*      pNumTypedArgs,  /* number of items in typed arg list    */
+    Boolean        tm_hack)        /* do baseTranslations                  */
+{
+/*
+ * assert: *pNumTypedArgs == 0 if num_args > 0
+ * assert: num_args == 0 if *pNumTypedArgs > 0
+ */
+#define SEARCHLISTLEN 100
+#define MAXRESOURCES  400
+
+    XrmValue       value;
+    XrmQuark       rawType;
+    XrmValue       convValue;
+    XrmHashTable    stackSearchList[SEARCHLISTLEN];
+    XrmHashTable    *searchList = stackSearchList;
+    unsigned int    searchListSize = SEARCHLISTLEN;
+    Boolean        found[MAXRESOURCES];
+    int                    typed[MAXRESOURCES];
+    XtCacheRef     cache_ref[MAXRESOURCES];
+    XtCacheRef      *cache_ptr, *cache_base;
+    Boolean        persistent_resources = True;
+    Boolean        found_persistence = False;
+    int                    num_typed_args = *pNumTypedArgs;
+    XrmDatabase     db;
+    Boolean        do_tm_hack = False;
+
+    if ((args == NULL) && (num_args != 0)) {
+       XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+               "invalidArgCount","getResources",XtCXtToolkitError,
+                 "argument count > 0 on NULL argument list",
+                   (String *)NULL, (Cardinal *)NULL);
+       num_args = 0;
+    }
+    if (num_resources == 0) {
+       return NULL;
+    } else if (num_resources >= MAXRESOURCES) {
+       XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+               "invalidResourceCount","getResources",XtCXtToolkitError,
+              "too many resources",
+             (String *)NULL, (Cardinal *)NULL);
+       return NULL;
+    } else if (table == NULL) {
+       XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+               "invalidResourceCount","getResources",XtCXtToolkitError,
+              "resource count > 0 on NULL resource list",
+             (String *)NULL, (Cardinal *)NULL);
+       return NULL;
+    }
+
+    /* Mark each resource as not found on arg list */
+    bzero((char *) found, (int) (num_resources * sizeof(Boolean)));
+    bzero((char *) typed, (int) (num_resources * sizeof(int)));
+
+    /* Copy the args into the resources, mark each as found */
+    {
+       register ArgList            arg;
+       register XtTypedArgList     typed_arg;
+       register XrmName            argName;
+       register Cardinal           j;
+       register int        i;
+       register XrmResourceList rx;
+       register XrmResourceList *res;
+       for (arg = args, i = 0; (Cardinal)i < num_args; i++, arg++) {
+           argName = quark_args[i];
+           if (argName == QinitialResourcesPersistent) {
+               persistent_resources = (Boolean)arg->value;
+               found_persistence = True;
+               continue;
+           }
+           for (j = 0, res = table; j < num_resources; j++, res++) {
+               rx = *res;
+               if (argName == rx->xrm_name) {
+                   _XtCopyFromArg(
+                       arg->value,
+                       base - rx->xrm_offset - 1,
+                       rx->xrm_size);
+                   found[j] = TRUE;
+                   break;
+               }
+           }
+       }
+       for (typed_arg = typed_args, i = 0; i < num_typed_args;
+            i++, typed_arg++) {
+           register XrmRepresentation argType;
+           argName = quark_args[i];
+           argType = (typed_arg->type == NULL) ? NULLQUARK
+               : XrmStringToRepresentation(typed_arg->type);
+           if (argName == QinitialResourcesPersistent) {
+               persistent_resources = (Boolean)typed_arg->value;
+               found_persistence = True;
+               break;
+           }
+           for (j = 0, res = table; j < num_resources; j++, res++) {
+               rx = *res;
+               if (argName == rx->xrm_name) {
+                   if (argType != NULLQUARK && argType != rx->xrm_type) {
+                       typed[j] = i + 1;
+                   } else {
+                       _XtCopyFromArg(
+                                      typed_arg->value,
+                                      base - rx->xrm_offset - 1,
+                                      rx->xrm_size);
+                   }
+                   found[j] = TRUE;
+                   break;
+               }
+           }
+       }
+    }
+
+    /* Ask resource manager for a list of database levels that we can
+       do a single-level search on each resource */
+
+    db = XtScreenDatabase(XtScreenOfObject(widget));
+    while (!XrmQGetSearchList(db, names, classes,
+                             searchList, searchListSize)) {
+       if (searchList == stackSearchList)
+           searchList = NULL;
+       searchList = (XrmHashTable*)XtRealloc((char*)searchList,
+                                             sizeof(XrmHashTable) *
+                                             (searchListSize *= 2));
+    }
+
+    if (persistent_resources)
+       cache_base = NULL;
+    else
+       cache_base = cache_ref;
+    /* geez, this is an ugly mess */
+    if (XtIsShell(widget)) {
+       register XrmResourceList  *res;
+       register Cardinal         j;
+       Screen *oldscreen = widget->core.screen;
+
+       /* look up screen resource first, since real rdb depends on it */
+       for (res = table, j = 0; j < num_resources; j++, res++) {
+           if ((*res)->xrm_name != Qscreen)
+               continue;
+           if (typed[j]) {
+               register XtTypedArg* arg = typed_args + typed[j] - 1;
+               XrmQuark from_type;
+               XrmValue from_val, to_val;
+
+               from_type = StringToQuark(arg->type);
+               from_val.size = arg->size;
+               if ((from_type == QString) || ((unsigned) arg->size > sizeof(XtArgVal)))
+                   from_val.addr = (XPointer)arg->value;
+               else
+                   from_val.addr = (XPointer)&arg->value;
+               to_val.size = sizeof(Screen*);
+               to_val.addr = (XPointer)&widget->core.screen;
+               found[j] = _XtConvert(widget, from_type, &from_val,
+                                     QScreen, &to_val, cache_base);
+               if (cache_base && *cache_base)
+                   cache_base++;
+           }
+           if (!found[j]) {
+               if (XrmQGetSearchResource(searchList, Qscreen, QScreen,
+                                     &rawType, &value)) {
+                   if (rawType != QScreen) {
+                       convValue.size = sizeof(Screen*);
+                       convValue.addr = (XPointer)&widget->core.screen;
+                       (void)_XtConvert(widget, rawType, &value,
+                                        QScreen, &convValue, cache_base);
+                       if (cache_base && *cache_base)
+                           cache_base++;
+                   } else {
+                       widget->core.screen = *((Screen **)value.addr);
+                   }
+               }
+           }
+           break;
+       }
+       /* now get the database to use for the rest of the resources */
+       if (widget->core.screen != oldscreen) {
+           db = XtScreenDatabase(widget->core.screen);
+           while (!XrmQGetSearchList(db, names, classes,
+                                     searchList, searchListSize)) {
+               if (searchList == stackSearchList)
+                   searchList = NULL;
+               searchList = (XrmHashTable*)XtRealloc((char*)searchList,
+                                                     sizeof(XrmHashTable) *
+                                                     (searchListSize *= 2));
+           }
+       }
+    }
+
+    /* go to the resource manager for those resources not found yet */
+    /* if it's not in the resource database use the default value   */
+
+    {
+       register XrmResourceList  rx;
+       register XrmResourceList  *res;
+       register Cardinal         j;
+       register XrmRepresentation xrm_type;
+       register XrmRepresentation xrm_default_type;
+       char    char_val;
+       short   short_val;
+       int     int_val;
+       long    long_val;
+       char*   char_ptr;
+
+       if (!found_persistence) {
+           if (XrmQGetSearchResource(searchList, QinitialResourcesPersistent,
+                       QInitialResourcesPersistent, &rawType, &value)) {
+               if (rawType != QBoolean) {
+                   convValue.size = sizeof(Boolean);
+                   convValue.addr = (XPointer)&persistent_resources;
+                   (void)_XtConvert(widget, rawType, &value, QBoolean,
+                                    &convValue, NULL);
+               }
+               else
+                   persistent_resources = *(Boolean*)value.addr;
+           }
+       }
+       if (persistent_resources)
+           cache_ptr = NULL;
+       else if (cache_base)
+           cache_ptr = cache_base;
+       else
+           cache_ptr = cache_ref;
+
+       for (res = table, j = 0; j < num_resources; j++, res++) {
+           rx = *res;
+           xrm_type = rx->xrm_type;
+           if (typed[j]) {
+               register XtTypedArg* arg = typed_args + typed[j] - 1;
+
+               /*
+                 * This resource value has been specified as a typed arg and
+                * has to be converted. Typed arg conversions are done here
+                * to correctly interpose them with normal resource conversions.
+                 */
+               XrmQuark            from_type;
+               XrmValue            from_val, to_val;
+               Boolean             converted;
+
+               from_type = StringToQuark(arg->type);
+               from_val.size = arg->size;
+               if ((from_type == QString) || ((unsigned) arg->size > sizeof(XtArgVal)))
+                   from_val.addr = (XPointer)arg->value;
+               else
+                   from_val.addr = (XPointer)&arg->value;
+               to_val.size = rx->xrm_size;
+               to_val.addr = base - rx->xrm_offset - 1;
+               converted = _XtConvert(widget, from_type, &from_val,
+                                      xrm_type, &to_val, cache_ptr);
+               if (converted) {
+
+                   /* Copy the converted value back into the typed argument.
+                    * normally the data should be <= sizeof(XtArgVal) and
+                    * is stored directly into the 'value' field .... BUT
+                    * if the resource size is greater than sizeof(XtArgVal)
+                    * then we dynamically alloc a block of store to hold the
+                    * data and zap a copy in there !!! .... freeing it later
+                    * the size field in the typed arg is negated to indicate
+                    * that the store pointed to by the value field is
+                    * dynamic .......
+                    * "freeing" happens in the case of _XtCreate after the
+                    * CallInitialize ..... other clients of GetResources
+                    * using typed args should be aware of the need to free
+                    * this store .....
+                    */
+
+                   if(rx->xrm_size > sizeof(XtArgVal)) {
+                       arg->value = (XtArgVal) __XtMalloc(rx->xrm_size);
+                       arg->size = -(arg->size);
+                   } else { /* will fit - copy directly into value field */
+                       arg->value = (XtArgVal) NULL;
+                   }
+                   CopyToArg((char *)(base - rx->xrm_offset - 1),
+                                &arg->value, rx->xrm_size);
+
+               } else {
+                  /* Conversion failed. Get default value. */
+                  found[j] = False;
+               }
+
+               if (cache_ptr && *cache_ptr)
+                   cache_ptr++;
+           }
+
+           if (!found[j]) {
+               Boolean already_copied = False;
+               Boolean have_value = False;
+
+               if (XrmQGetSearchResource(searchList,
+                       rx->xrm_name, rx->xrm_class, &rawType, &value)) {
+                   if (rawType != xrm_type) {
+                       convValue.size = rx->xrm_size;
+                       convValue.addr = (XPointer)(base - rx->xrm_offset - 1);
+                       already_copied = have_value =
+                           _XtConvert(widget, rawType, &value,
+                                      xrm_type, &convValue, cache_ptr);
+                       if (cache_ptr && *cache_ptr)
+                           cache_ptr++;
+                   } else have_value = True;
+                   if (have_value && rx->xrm_name == Qtranslations)
+                       do_tm_hack = True;
+               }
+               LOCK_PROCESS;
+               if (!have_value
+                   && ((rx->xrm_default_type == QImmediate)
+                       || (rx->xrm_default_type == xrm_type)
+                       || (rx->xrm_default_addr != NULL))) {
+                   /* Convert default value to proper type */
+                   xrm_default_type = rx->xrm_default_type;
+                   if (xrm_default_type == QCallProc) {
+#ifdef CRAY
+                       if ( (int) Cjumpp != (int) Cjump)
+                           (*(XtResourceDefaultProc)
+                             (((int)(rx->xrm_default_addr))<<2))(
+                                widget,-(rx->xrm_offset+1), &value);
+                       else
+#endif
+                       (*(XtResourceDefaultProc)(rx->xrm_default_addr))(
+                             widget,-(rx->xrm_offset+1), &value);
+
+                   } else if (xrm_default_type == QImmediate) {
+                       /* XtRImmediate == XtRString for type XtRString */
+                       if (xrm_type == QString) {
+                           value.addr = rx->xrm_default_addr;
+                       } else if (rx->xrm_size == sizeof(int)) {
+                           int_val = (int)(long)rx->xrm_default_addr;
+                           value.addr = (XPointer) &int_val;
+                       } else if (rx->xrm_size == sizeof(short)) {
+                           short_val = (short)(long)rx->xrm_default_addr;
+                           value.addr = (XPointer) &short_val;
+                       } else if (rx->xrm_size == sizeof(char)) {
+                           char_val = (char)(long)rx->xrm_default_addr;
+                           value.addr = (XPointer) &char_val;
+                       } else if (rx->xrm_size == sizeof(long)) {
+                           long_val = (long)rx->xrm_default_addr;
+                           value.addr = (XPointer) &long_val;
+                       } else if (rx->xrm_size == sizeof(char*)) {
+                           char_ptr = (char*)rx->xrm_default_addr;
+                           value.addr = (XPointer) &char_ptr;
+                       } else {
+                           value.addr = (XPointer) &(rx->xrm_default_addr);
+                       }
+                   } else if (xrm_default_type == xrm_type) {
+                       value.addr = rx->xrm_default_addr;
+                   } else {
+                       value.addr = rx->xrm_default_addr;
+                       if (xrm_default_type == QString) {
+                           value.size = strlen((char *)value.addr) + 1;
+                       } else {
+                           value.size = sizeof(XtPointer);
+                       }
+                       convValue.size = rx->xrm_size;
+                       convValue.addr = (XPointer)(base - rx->xrm_offset - 1);
+                       already_copied =
+                           _XtConvert(widget, xrm_default_type, &value,
+                                      xrm_type, &convValue, cache_ptr);
+                       if (!already_copied)
+                           value.addr = NULL;
+                       if (cache_ptr && *cache_ptr)
+                           cache_ptr++;
+                   }
+               }
+               if (!already_copied) {
+                   if (xrm_type == QString) {
+                       *((String*)(base - rx->xrm_offset - 1)) = value.addr;
+                   } else {
+                       if (value.addr != NULL) {
+                           XtMemmove(base - rx->xrm_offset - 1,
+                                     value.addr, rx->xrm_size);
+                       } else {
+                           /* didn't get value, initialize to NULL... */
+                           XtBZero(base - rx->xrm_offset - 1, rx->xrm_size);
+                       }
+                   }
+               }
+               UNLOCK_PROCESS;
+           } 
+       }
+       for (res = table, j = 0; j < num_resources; j++, res++) {
+           if (!found[j] && typed[j]) {
+               /*
+                * This resource value was specified as a typed arg.
+                * However, the default value is being used here since
+                * type type conversion failed, so we compress the list.
+                */
+               register XtTypedArg* arg = typed_args + typed[j] - 1;
+               register int i;
+
+               for (i = num_typed_args - typed[j]; i > 0; i--, arg++) {
+                   *arg = *(arg+1);
+               }
+               num_typed_args--;
+           }
+       }
+       if (tm_hack)
+           widget->core.tm.current_state = NULL;
+       if (tm_hack &&
+           (!widget->core.tm.translations ||
+            (do_tm_hack &&
+             widget->core.tm.translations->operation != XtTableReplace)) &&
+           XrmQGetSearchResource(searchList, QbaseTranslations,
+                                 QTranslations, &rawType, &value)) {
+           if (rawType != QTranslationTable) {
+               convValue.size = sizeof(XtTranslations);
+               convValue.addr = (XPointer)&widget->core.tm.current_state;
+               (void)_XtConvert(widget, rawType, &value,
+                                QTranslationTable, &convValue, cache_ptr);
+               if (cache_ptr && *cache_ptr)
+                   cache_ptr++;
+           } else {
+               /* value.addr can be NULL see: !already_copied */
+               if (value.addr)
+                   *((XtTranslations *)&widget->core.tm.current_state) =
+                       *((XtTranslations *)value.addr);
+           }
+       }
+    }
+    if ((Cardinal)num_typed_args != *pNumTypedArgs) *pNumTypedArgs = num_typed_args;
+    if (searchList != stackSearchList) XtFree((char*)searchList);
+    if (!cache_ptr)
+       cache_ptr = cache_base;
+    if (cache_ptr && cache_ptr != cache_ref) {
+       int cache_ref_size = cache_ptr - cache_ref;
+       XtCacheRef *refs = (XtCacheRef*)
+           __XtMalloc((unsigned)sizeof(XtCacheRef)*(cache_ref_size + 1));
+       (void) memmove(refs, cache_ref, sizeof(XtCacheRef)*cache_ref_size );
+       refs[cache_ref_size] = NULL;
+       return refs;
+    }
+    return (XtCacheRef*)NULL;
+}
+
+
+
+static void CacheArgs(
+    ArgList        args,
+    Cardinal       num_args,
+    XtTypedArgList  typed_args,
+    Cardinal       num_typed_args,
+    XrmQuarkList    quark_cache,
+    Cardinal       num_quarks,
+    XrmQuarkList    *pQuarks)       /* RETURN */
+{
+    register XrmQuarkList   quarks;
+    register Cardinal       i;
+    register Cardinal       count;
+
+    count = (args != NULL) ? num_args : num_typed_args;
+
+    if (num_quarks < count) {
+       quarks = (XrmQuarkList) __XtMalloc(count * sizeof(XrmQuark));
+    } else {
+       quarks = quark_cache;
+    }
+    *pQuarks = quarks;
+
+    if (args != NULL) {
+       for (i = count; i; i--)
+           *quarks++ = StringToQuark((args++)->name);
+    }
+    else {
+       for (i = count; i; i--)
+           *quarks++ = StringToQuark((typed_args++)->name);
+    }
+}
+
+#define FreeCache(cache, pointer) \
+         if (cache != pointer) XtFree((char *)pointer)
+
+
+XtCacheRef *_XtGetResources(
+    register   Widget          w,
+               ArgList         args,
+               Cardinal        num_args,
+               XtTypedArgList  typed_args,
+               Cardinal*       num_typed_args)
+{
+    XrmName        *names, names_s[50];
+    XrmClass       *classes, classes_s[50];
+    XrmQuark       quark_cache[100];
+    XrmQuarkList    quark_args;
+    WidgetClass     wc;
+    ConstraintWidgetClass   cwc;
+    XtCacheRef     *cache_refs, *cache_refs_core;
+    Cardinal       count;
+
+    wc = XtClass(w);
+
+    count = CountTreeDepth(w);
+    names = (XrmName*) XtStackAlloc (count * sizeof(XrmName), names_s);
+    classes = (XrmClass*) XtStackAlloc (count * sizeof(XrmClass), classes_s);
+    if (names == NULL || classes == NULL) _XtAllocError(NULL);
+
+    /* Get names, classes for widget and ancestors */
+    GetNamesAndClasses(w, names, classes);
+
+    /* Compile arg list into quarks */
+    CacheArgs(args, num_args, typed_args, *num_typed_args, quark_cache,
+             XtNumber(quark_cache), &quark_args);
+
+    /* Get normal resources */
+    LOCK_PROCESS;
+    cache_refs = GetResources(w, (char*)w, names, classes,
+       (XrmResourceList *) wc->core_class.resources,
+       wc->core_class.num_resources, quark_args, args, num_args,
+       typed_args, num_typed_args, XtIsWidget(w));
+
+    if (w->core.constraints != NULL) {
+       cwc = (ConstraintWidgetClass) XtClass(w->core.parent);
+       cache_refs_core =
+           GetResources(w, (char*)w->core.constraints, names, classes,
+           (XrmResourceList *) cwc->constraint_class.resources,
+           cwc->constraint_class.num_resources,
+           quark_args, args, num_args, typed_args, num_typed_args, False);
+       if (cache_refs_core) {
+           XtFree((char *)cache_refs_core);
+       }
+    }
+    FreeCache(quark_cache, quark_args);
+    UNLOCK_PROCESS;
+    XtStackFree((XtPointer)names, names_s);
+    XtStackFree((XtPointer)classes, classes_s);
+    return cache_refs;
+} /* _XtGetResources */
+
+
+void _XtGetSubresources (
+    Widget       w,                    /* Widget "parent" of subobject   */
+    XtPointer    base,                 /* Base address to write to       */
+    const char*   name,                        /* name of subobject                */
+    const char*   class,               /* class of subobject               */
+    XtResourceList resources,          /* resource list for subobject    */
+    Cardinal     num_resources,
+    ArgList      args,                 /* arg list to override resources */
+    Cardinal     num_args,
+    XtTypedArgList typed_args,
+    Cardinal      num_typed_args)
+{
+    XrmName      *names, names_s[50];
+    XrmClass     *classes, classes_s[50];
+    XrmQuark     quark_cache[100];
+    XrmQuarkList  quark_args;
+    XrmResourceList* table;
+    Cardinal     count, ntyped_args = num_typed_args;
+    XtCacheRef    *Resrc = NULL;
+    WIDGET_TO_APPCON(w);
+
+    if (num_resources == 0) return;
+
+    LOCK_APP(app);
+    count = CountTreeDepth(w);
+    count++;   /* make sure there's enough room for name and class */
+    names = (XrmName*) XtStackAlloc(count * sizeof(XrmName), names_s);
+    classes = (XrmClass*) XtStackAlloc(count * sizeof(XrmClass), classes_s);
+    if (names == NULL || classes == NULL) _XtAllocError(NULL);
+
+    /* Get full name, class of subobject */
+    GetNamesAndClasses(w, names, classes);
+    count -= 2;
+    names[count] = StringToName(name);
+    classes[count] = StringToClass(class);
+    count++;
+    names[count] = NULLQUARK;
+    classes[count] = NULLQUARK;
+
+    /* Compile arg list into quarks */
+    CacheArgs(args, num_args, typed_args, num_typed_args,
+             quark_cache, XtNumber(quark_cache), &quark_args);
+
+    /* Compile resource list if needed */
+    if (((int) resources->resource_offset) >= 0) {
+       XrmCompileResourceListEphem(resources, num_resources);
+    }
+    table = _XtCreateIndirectionTable(resources, num_resources);
+    Resrc = GetResources(w, (char*)base, names, classes, table, num_resources,
+                       quark_args, args, num_args,
+                       typed_args, &ntyped_args, False);
+    FreeCache(quark_cache, quark_args);
+    XtFree((char *)table);
+    XtFree((char *)Resrc);
+    XtStackFree((XtPointer)names, names_s);
+    XtStackFree((XtPointer)classes, classes_s);
+    UNLOCK_APP(app);
+}
+
+void XtGetSubresources (
+    Widget       w,                    /* Widget "parent" of subobject   */
+    XtPointer    base,                 /* Base address to write to       */
+    _Xconst char* name,                        /* name of subobject                */
+    _Xconst char* class,               /* class of subobject               */
+    XtResourceList resources,          /* resource list for subobject    */
+    Cardinal     num_resources,
+    ArgList      args,                 /* arg list to override resources */
+    Cardinal     num_args)
+{
+    _XtGetSubresources (w, base, name, class, resources, num_resources, args, num_args, NULL, 0);
+}
+
+
+void _XtGetApplicationResources (
+    Widget         w,            /* Application shell widget       */
+    XtPointer      base,         /* Base address to write to       */
+    XtResourceList  resources,   /* resource list for subobject    */
+    Cardinal       num_resources,
+    ArgList        args,         /* arg list to override resources */
+    Cardinal       num_args,
+    XtTypedArgList  typed_args,
+    Cardinal       num_typed_args)
+{
+    XrmName        *names, names_s[50];
+    XrmClass       *classes, classes_s[50];
+    XrmQuark       quark_cache[100];
+    XrmQuarkList    quark_args;
+    XrmResourceList* table;
+    Cardinal        count, ntyped_args = num_typed_args;
+#ifdef XTHREADS
+    XtAppContext    app;
+#endif
+    XtCacheRef     *Resrc = NULL;
+
+    if (num_resources == 0) return;
+
+#ifdef XTHREADS
+    if (w == NULL) app = _XtDefaultAppContext();
+    else app = XtWidgetToApplicationContext(w);
+#endif
+
+    LOCK_APP(app);
+    /* Get full name, class of application */
+    if (w == NULL) {
+       /* hack for R2 compatibility */
+       XtPerDisplay pd = _XtGetPerDisplay(_XtDefaultAppContext()->list[0]);
+       names = (XrmName*) XtStackAlloc (2 * sizeof(XrmName), names_s);
+       classes = (XrmClass*) XtStackAlloc (2 * sizeof(XrmClass), classes_s);
+       names[0] = pd->name;
+       names[1] = NULLQUARK;
+       classes[0] = pd->class;
+       classes[1] = NULLQUARK;
+    }
+    else {
+       count = CountTreeDepth(w);
+        names = (XrmName*) XtStackAlloc(count * sizeof(XrmName), names_s);
+        classes = (XrmClass*) XtStackAlloc(count * sizeof(XrmClass), classes_s);
+       if (names == NULL || classes == NULL) _XtAllocError(NULL);
+       GetNamesAndClasses(w, names, classes);
+    }
+
+    /* Compile arg list into quarks */
+    CacheArgs(args, num_args, typed_args, num_typed_args,  quark_cache,
+       XtNumber(quark_cache), &quark_args);
+    /* Compile resource list if needed */
+    if (((int) resources->resource_offset) >= 0) {
+#ifdef CRAY2
+       if (base == 0) {        /* this client is non-portable, but... */
+           int count;
+           XtResourceList  res = resources;
+           for (count = 0; count < num_resources; res++, count++) {
+               res->resource_offset *= sizeof(long);
+           }
+       }
+#endif /* CRAY2 */
+       XrmCompileResourceListEphem(resources, num_resources);
+    }
+    table = _XtCreateIndirectionTable(resources,num_resources);
+
+    Resrc = GetResources(w, (char*)base, names, classes, table, num_resources,
+                       quark_args, args, num_args,
+                       typed_args, &ntyped_args, False);
+    FreeCache(quark_cache, quark_args);
+    XtFree((char *)table);
+    XtFree((char *)Resrc);
+    if (w != NULL) {
+       XtStackFree((XtPointer)names, names_s);
+       XtStackFree((XtPointer)classes, classes_s);
+    }
+    UNLOCK_APP(app);
+}
+
+void XtGetApplicationResources (
+    Widget         w,            /* Application shell widget       */
+    XtPointer      base,         /* Base address to write to       */
+    XtResourceList  resources,   /* resource list for subobject    */
+    Cardinal       num_resources,
+    ArgList        args,         /* arg list to override resources */
+    Cardinal       num_args)
+{
+    _XtGetApplicationResources(w, base, resources, num_resources, args, num_args, NULL, 0);
+}
+
+static Boolean initialized = FALSE;
+
+void _XtResourceListInitialize(void)
+{
+    LOCK_PROCESS;
+    if (initialized) {
+       XtWarningMsg("initializationError","xtInitialize",XtCXtToolkitError,
+                  "Initializing Resource Lists twice",
+                 (String *)NULL, (Cardinal *)NULL);
+       UNLOCK_PROCESS;
+       return;
+    }
+    initialized = TRUE;
+    UNLOCK_PROCESS;
+
+    QBoolean = XrmPermStringToQuark(XtCBoolean);
+    QString = XrmPermStringToQuark(XtCString);
+    QCallProc = XrmPermStringToQuark(XtRCallProc);
+    QImmediate = XrmPermStringToQuark(XtRImmediate);
+    QinitialResourcesPersistent = XrmPermStringToQuark(XtNinitialResourcesPersistent);
+    QInitialResourcesPersistent = XrmPermStringToQuark(XtCInitialResourcesPersistent);
+    Qtranslations = XrmPermStringToQuark(XtNtranslations);
+    QbaseTranslations = XrmPermStringToQuark("baseTranslations");
+    QTranslations = XrmPermStringToQuark(XtCTranslations);
+    QTranslationTable = XrmPermStringToQuark(XtRTranslationTable);
+    Qscreen = XrmPermStringToQuark(XtNscreen);
+    QScreen = XrmPermStringToQuark(XtCScreen);
+}
diff --git a/src/Selection.c b/src/Selection.c
new file mode 100644 (file)
index 0000000..f35cb44
--- /dev/null
@@ -0,0 +1,2307 @@
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+#include "SelectionI.h"
+#include <X11/Xatom.h>
+#include <stdio.h>
+
+void _XtSetDefaultSelectionTimeout(
+       unsigned long *timeout)
+{
+       *timeout = 5000; /* default to 5 seconds */
+}
+
+void XtSetSelectionTimeout(
+       unsigned long timeout)
+{
+       XtAppSetSelectionTimeout(_XtDefaultAppContext(), timeout);
+}
+
+void XtAppSetSelectionTimeout(
+       XtAppContext app,
+       unsigned long timeout)
+{
+       LOCK_APP(app);
+       app->selectionTimeout = timeout;
+       UNLOCK_APP(app);
+}
+
+unsigned long XtGetSelectionTimeout(void)
+{
+       return XtAppGetSelectionTimeout(_XtDefaultAppContext());
+}
+
+unsigned long XtAppGetSelectionTimeout(
+       XtAppContext app)
+{
+       unsigned long retval;
+
+       LOCK_APP(app);
+       retval = app->selectionTimeout;
+       UNLOCK_APP(app);
+       return retval;
+}
+
+
+/* General utilities */
+
+static void HandleSelectionReplies(Widget, XtPointer, XEvent *, Boolean *);
+static void ReqTimedOut(XtPointer, XtIntervalId *);
+static void HandlePropertyGone(Widget, XtPointer, XEvent *, Boolean *);
+static void HandleGetIncrement(Widget, XtPointer, XEvent *, Boolean *);
+static void HandleIncremental(Display *, Widget, Atom, CallBackInfo, unsigned long);
+
+static XContext selectPropertyContext = 0;
+static XContext paramPropertyContext = 0;
+static XContext multipleContext = 0;
+
+/* Multiple utilities */
+static void AddSelectionRequests(Widget, Atom, int, Atom *, XtSelectionCallbackProc *, int, XtPointer *, Boolean *, Atom *);
+static Boolean IsGatheringRequest(Widget, Atom);
+
+#define PREALLOCED 32
+
+/* Parameter utilities */
+static void AddParamInfo(Widget, Atom, Atom);
+static void RemoveParamInfo(Widget, Atom);
+static Atom GetParamInfo(Widget, Atom);
+
+static int StorageSize[3] = {1, sizeof(short), sizeof(long)};
+#define BYTELENGTH(length, format) ((length) * StorageSize[(format)>>4])
+#define NUMELEM(bytelength, format) ((bytelength) / StorageSize[(format)>>4])
+
+/* Xlib and Xt are permitted to have different memory allocators, and in the
+ * XtSelectionCallbackProc the client is instructed to free the selection
+ * value with XtFree, so the selection value received from XGetWindowProperty
+ * should be copied to memory allocated through Xt.  But copying is
+ * undesirable since the selection value may be large, and, under normal
+ * library configuration copying is unnecessary.
+ */
+#ifdef XTTRACEMEMORY
+#define XT_COPY_SELECTION      1
+#endif
+
+/*ARGSUSED*/
+static void FreePropList(
+ Widget w,                     /* unused */
+ XtPointer closure,
+ XtPointer callData)           /* unused */
+{
+    PropList sarray = (PropList)closure;
+    LOCK_PROCESS;
+    XDeleteContext(sarray->dpy, DefaultRootWindow(sarray->dpy),
+                  selectPropertyContext);
+    UNLOCK_PROCESS;
+    XtFree((char*)sarray->list);
+    XtFree((char*)closure);
+}
+
+
+static PropList GetPropList(
+    Display *dpy)
+{
+    PropList sarray;
+    Atom atoms[4];
+    static char* names[] = {
+       "INCR",
+       "MULTIPLE",
+       "TIMESTAMP",
+       "_XT_SELECTION_0" };
+
+    LOCK_PROCESS;
+    if (selectPropertyContext == 0)
+       selectPropertyContext = XUniqueContext();
+    if (XFindContext(dpy, DefaultRootWindow(dpy), selectPropertyContext,
+                    (XPointer *)&sarray)) {
+       XtPerDisplay pd = _XtGetPerDisplay(dpy);
+       sarray = (PropList) __XtMalloc((unsigned) sizeof(PropListRec));
+       sarray->dpy = dpy;
+       XInternAtoms(dpy, names, 4, FALSE, atoms);
+       sarray->incr_atom = atoms[0];
+       sarray->indirect_atom = atoms[1];
+       sarray->timestamp_atom = atoms[2];
+       sarray->propCount = 1;
+       sarray->list =
+           (SelectionProp)__XtMalloc((unsigned) sizeof(SelectionPropRec));
+       sarray->list[0].prop = atoms[3];
+       sarray->list[0].avail = TRUE;
+       (void) XSaveContext(dpy, DefaultRootWindow(dpy), selectPropertyContext,
+                           (char *) sarray);
+       _XtAddCallback( &pd->destroy_callbacks,
+                       FreePropList, (XtPointer)sarray );
+    }
+    UNLOCK_PROCESS;
+    return sarray;
+}
+
+
+static Atom GetSelectionProperty(
+    Display *dpy)
+{
+ SelectionProp p;
+ int propCount;
+ char propname[80];
+ PropList sarray = GetPropList(dpy);
+
+ for (p = sarray->list, propCount=sarray->propCount;
+       propCount;
+       p++, propCount--) {
+   if (p->avail) {
+      p->avail = FALSE;
+      return(p->prop);
+   }
+ }
+ propCount = sarray->propCount++;
+ sarray->list = (SelectionProp) XtRealloc((XtPointer)sarray->list,
+               (unsigned)(sarray->propCount*sizeof(SelectionPropRec)));
+ (void) snprintf(propname, sizeof(propname), "_XT_SELECTION_%d", propCount);
+ sarray->list[propCount].prop = XInternAtom(dpy, propname, FALSE);
+ sarray->list[propCount].avail = FALSE;
+ return(sarray->list[propCount].prop);
+}
+
+static void FreeSelectionProperty(
+    Display *dpy,
+    Atom prop)
+{
+ SelectionProp p;
+ int propCount;
+ PropList sarray;
+ if (prop == None) return;
+ LOCK_PROCESS;
+ if (XFindContext(dpy, DefaultRootWindow(dpy), selectPropertyContext,
+                 (XPointer *)&sarray))
+    XtAppErrorMsg(XtDisplayToApplicationContext(dpy),
+           "noSelectionProperties", "freeSelectionProperty", XtCXtToolkitError,
+               "internal error: no selection property context for display",
+                (String *)NULL,  (Cardinal *)NULL );
+ UNLOCK_PROCESS;
+ for (p = sarray->list, propCount=sarray->propCount;
+       propCount;
+       p++, propCount--)
+   if (p->prop == prop) {
+      p->avail = TRUE;
+      return;
+      }
+}
+
+static void FreeInfo(
+    CallBackInfo info)
+{
+    XtFree((char*)info->incremental);
+    XtFree((char*)info->callbacks);
+    XtFree((char*)info->req_closure);
+    XtFree((char*)info->target);
+    XtFree((char*)info);
+}
+
+static CallBackInfo MakeInfo(
+    Select ctx,
+    XtSelectionCallbackProc *callbacks,
+    XtPointer *closures,
+    int count,
+    Widget widget,
+    Time time,
+    Boolean *incremental,
+    Atom *properties)
+{
+       CallBackInfo info = XtNew(CallBackInfoRec);
+
+       info->ctx = ctx;
+       info->callbacks = (XtSelectionCallbackProc *)
+           __XtMalloc((unsigned) (count * sizeof(XtSelectionCallbackProc)));
+       (void) memmove((char*)info->callbacks, (char*)callbacks,
+                      count * sizeof(XtSelectionCallbackProc));
+       info->req_closure =
+           (XtPointer*)__XtMalloc((unsigned) (count * sizeof(XtPointer)));
+       (void) memmove((char*)info->req_closure, (char*)closures,
+                      count * sizeof(XtPointer));
+       if (count == 1 && properties != NULL && properties[0] != None)
+           info->property = properties[0];
+       else {
+           info->property = GetSelectionProperty(XtDisplay(widget));
+           XDeleteProperty(XtDisplay(widget), XtWindow(widget),
+                           info->property);
+       }
+       info->proc = HandleSelectionReplies;
+       info->widget = widget;
+       info->time = time;
+       info->incremental = (Boolean*) __XtMalloc(count * sizeof(Boolean));
+       (void) memmove((char*)info->incremental, (char*) incremental,
+                      count * sizeof(Boolean));
+       info->current = 0;
+       info->value = NULL;
+       return (info);
+}
+
+static void RequestSelectionValue(
+    CallBackInfo info,
+    Atom selection,
+    Atom target)
+{
+#ifndef DEBUG_WO_TIMERS
+    XtAppContext app = XtWidgetToApplicationContext(info->widget);
+       info->timeout = XtAppAddTimeOut(app,
+                        app->selectionTimeout, ReqTimedOut, (XtPointer)info);
+#endif
+       XtAddEventHandler(info->widget, (EventMask)0, TRUE,
+                         HandleSelectionReplies, (XtPointer)info);
+       XConvertSelection(info->ctx->dpy, selection, target,
+                         info->property, XtWindow(info->widget), info->time);
+}
+
+
+static XContext selectContext = 0;
+
+static Select NewContext(
+    Display *dpy,
+    Atom selection)
+{
+    /* assert(selectContext != 0) */
+    Select ctx = XtNew(SelectRec);
+    ctx->dpy = dpy;
+    ctx->selection = selection;
+    ctx->widget = NULL;
+    ctx->prop_list = GetPropList(dpy);
+    ctx->ref_count = 0;
+    ctx->free_when_done = FALSE;
+    ctx->was_disowned = FALSE;
+    LOCK_PROCESS;
+    (void)XSaveContext(dpy, (Window)selection, selectContext, (char *)ctx);
+    UNLOCK_PROCESS;
+    return ctx;
+}
+
+static Select FindCtx(
+    Display *dpy,
+    Atom selection)
+{
+    Select ctx;
+
+    LOCK_PROCESS;
+    if (selectContext == 0)
+       selectContext = XUniqueContext();
+    if (XFindContext(dpy, (Window)selection, selectContext, (XPointer *)&ctx))
+       ctx = NewContext(dpy, selection);
+    UNLOCK_PROCESS;
+    return ctx;
+}
+
+/*ARGSUSED*/
+static void WidgetDestroyed(
+    Widget widget,
+    XtPointer closure, XtPointer data)
+{
+    Select ctx = (Select) closure;
+    if (ctx->widget == widget) {
+       if (ctx->free_when_done)
+           XtFree((char*)ctx);
+       else
+           ctx->widget = NULL;
+    }
+}
+
+/* Selection Owner code */
+
+static void HandleSelectionEvents(Widget, XtPointer, XEvent *, Boolean *);
+
+static Boolean LoseSelection(
+    Select ctx,
+    Widget widget,
+    Atom selection,
+    Time time)
+{
+    if ((ctx->widget == widget) &&
+       (ctx->selection == selection) && /* paranoia */
+       !ctx->was_disowned &&
+       ((time == CurrentTime) || (time >= ctx->time)))
+    {
+       XtRemoveEventHandler(widget, (EventMask)0, TRUE,
+                            HandleSelectionEvents, (XtPointer)ctx);
+       XtRemoveCallback(widget, XtNdestroyCallback,
+                        WidgetDestroyed, (XtPointer)ctx);
+       ctx->was_disowned = TRUE; /* widget officially loses ownership */
+       /* now inform widget */
+       if (ctx->loses) {
+           if (ctx->incremental)
+              (*(XtLoseSelectionIncrProc)ctx->loses)
+                  (widget, &ctx->selection, ctx->owner_closure);
+           else  (*ctx->loses)(widget, &ctx->selection);
+       }
+       return(TRUE);
+    }
+    else return(FALSE);
+}
+
+static XContext selectWindowContext = 0;
+
+/* %%% Xlib.h should make this public! */
+typedef int (*xErrorHandler)(Display*, XErrorEvent*);
+
+static xErrorHandler oldErrorHandler = NULL;
+static unsigned long firstProtectRequest;
+static Window errorWindow;
+
+static int LocalErrorHandler (
+    Display *dpy,
+    XErrorEvent *error)
+{
+    int retval;
+
+    /* If BadWindow error on selection requestor, nothing to do but let
+     * the transfer timeout.  Otherwise, invoke saved error handler. */
+
+    LOCK_PROCESS;
+
+    if (error->error_code == BadWindow && error->resourceid == errorWindow &&
+       error->serial >= firstProtectRequest) {
+       UNLOCK_PROCESS;
+       return 0;
+    }
+
+    if (oldErrorHandler == NULL) {
+       UNLOCK_PROCESS;
+       return 0;  /* should never happen */
+    }
+
+    retval = (*oldErrorHandler)(dpy, error);
+    UNLOCK_PROCESS;
+    return retval;
+}
+
+static void StartProtectedSection(
+    Display *dpy,
+    Window window)
+{
+    /* protect ourselves against request window being destroyed
+     * before completion of transfer */
+
+    LOCK_PROCESS;
+    oldErrorHandler = XSetErrorHandler(LocalErrorHandler);
+    firstProtectRequest = NextRequest(dpy);
+    errorWindow = window;
+    UNLOCK_PROCESS;
+}
+
+static void EndProtectedSection(
+    Display *dpy)
+{
+    /* flush any generated errors on requestor and
+     * restore original error handler */
+
+    XSync(dpy, False);
+
+    LOCK_PROCESS;
+    XSetErrorHandler(oldErrorHandler);
+    oldErrorHandler = NULL;
+    UNLOCK_PROCESS;
+}
+
+static void AddHandler(
+    Request req,
+    EventMask mask,
+    XtEventHandler proc,
+    XtPointer closure)
+{
+    Display *dpy = req->ctx->dpy;
+    Window window = req->requestor;
+    Widget widget = XtWindowToWidget(dpy, window);
+
+    if (widget != NULL) req->widget = widget;
+    else widget = req->widget;
+
+    if (XtWindow(widget) == window)
+       XtAddEventHandler(widget, mask, False, proc, closure);
+    else {
+       RequestWindowRec *requestWindowRec;
+       LOCK_PROCESS;
+       if (selectWindowContext == 0)
+           selectWindowContext = XUniqueContext();
+       if (XFindContext(dpy, window, selectWindowContext,
+                        (XPointer *)&requestWindowRec)) {
+           requestWindowRec = XtNew(RequestWindowRec);
+           requestWindowRec->active_transfer_count = 0;
+           (void)XSaveContext(dpy, window, selectWindowContext,
+                              (char *)requestWindowRec);
+       }
+       UNLOCK_PROCESS;
+       if (requestWindowRec->active_transfer_count++ == 0) {
+           XtRegisterDrawable(dpy, window, widget);
+           XSelectInput(dpy, window, mask);
+       }
+       XtAddRawEventHandler(widget, mask, FALSE, proc, closure);
+    }
+}
+
+static void RemoveHandler(
+    Request req,
+    EventMask mask,
+    XtEventHandler proc,
+    XtPointer closure)
+{
+    Display *dpy = req->ctx->dpy;
+    Window window = req->requestor;
+    Widget widget = req->widget;
+
+    if ((XtWindowToWidget(dpy, window) == widget) &&
+        (XtWindow(widget) != window)) {
+       /* we had to hang this window onto our widget; take it off */
+       RequestWindowRec* requestWindowRec;
+       XtRemoveRawEventHandler(widget, mask, TRUE, proc, closure);
+       LOCK_PROCESS;
+       (void)XFindContext(dpy, window, selectWindowContext,
+                          (XPointer *)&requestWindowRec);
+       UNLOCK_PROCESS;
+       if (--requestWindowRec->active_transfer_count == 0) {
+           XtUnregisterDrawable(dpy, window);
+           StartProtectedSection(dpy, window);
+           XSelectInput(dpy, window, 0L);
+           EndProtectedSection(dpy);
+           LOCK_PROCESS;
+           (void)XDeleteContext(dpy, window, selectWindowContext);
+           UNLOCK_PROCESS;
+           XtFree((char*)requestWindowRec);
+       }
+    } else {
+        XtRemoveEventHandler(widget, mask, TRUE,  proc, closure);
+    }
+}
+
+/* ARGSUSED */
+static void OwnerTimedOut(
+    XtPointer closure,
+    XtIntervalId   *id)
+{
+    Request req = (Request)closure;
+    Select ctx = req->ctx;
+
+    if (ctx->incremental && (ctx->owner_cancel != NULL)) {
+       (*ctx->owner_cancel)(ctx->widget, &ctx->selection,
+                            &req->target, (XtRequestId*)&req,
+                            ctx->owner_closure);
+    } else {
+       if (ctx->notify == NULL)
+           XtFree((char*)req->value);
+       else {
+           /* the requestor hasn't deleted the property, but
+            * the owner needs to free the value.
+            */
+           if (ctx->incremental)
+               (*(XtSelectionDoneIncrProc)ctx->notify)
+                             (ctx->widget, &ctx->selection, &req->target,
+                              (XtRequestId*)&req, ctx->owner_closure);
+           else
+               (*ctx->notify)(ctx->widget, &ctx->selection, &req->target);
+       }
+    }
+
+    RemoveHandler(req, (EventMask)PropertyChangeMask,
+                 HandlePropertyGone, closure);
+    XtFree((char*)req);
+    if (--ctx->ref_count == 0 && ctx->free_when_done)
+       XtFree((char*)ctx);
+}
+
+static void SendIncrement(
+    Request incr)
+{
+    Display *dpy = incr->ctx->dpy;
+
+    unsigned long incrSize = MAX_SELECTION_INCR(dpy);
+    if (incrSize > incr->bytelength - incr->offset)
+        incrSize = incr->bytelength - incr->offset;
+    StartProtectedSection(dpy, incr->requestor);
+    XChangeProperty(dpy, incr->requestor, incr->property,
+           incr->type, incr->format, PropModeReplace,
+           (unsigned char *)incr->value + incr->offset,
+           NUMELEM((int)incrSize, incr->format));
+    EndProtectedSection(dpy);
+    incr->offset += incrSize;
+}
+
+static void AllSent(
+    Request req)
+{
+    Select ctx = req->ctx;
+    StartProtectedSection(ctx->dpy, req->requestor);
+    XChangeProperty(ctx->dpy, req->requestor,
+                   req->property, req->type,  req->format,
+                   PropModeReplace, (unsigned char *) NULL, 0);
+    EndProtectedSection(ctx->dpy);
+    req->allSent = TRUE;
+
+    if (ctx->notify == NULL) XtFree((char*)req->value);
+}
+
+/*ARGSUSED*/
+static void HandlePropertyGone(
+    Widget widget,
+    XtPointer closure,
+    XEvent *ev,
+    Boolean *cont)
+{
+    XPropertyEvent *event = (XPropertyEvent *) ev;
+    Request req = (Request)closure;
+    Select ctx = req->ctx;
+
+    if ((event->type != PropertyNotify) ||
+        (event->state != PropertyDelete) ||
+       (event->atom != req->property) ||
+       (event->window != req->requestor))
+      return;
+#ifndef DEBUG_WO_TIMERS
+    XtRemoveTimeOut(req->timeout);
+#endif
+    if (req->allSent) {
+       if (ctx->notify) {
+           if (ctx->incremental) {
+               (*(XtSelectionDoneIncrProc)ctx->notify)
+                             (ctx->widget, &ctx->selection, &req->target,
+                              (XtRequestId*)&req, ctx->owner_closure);
+           }
+           else (*ctx->notify)(ctx->widget, &ctx->selection, &req->target);
+       }
+       RemoveHandler(req, (EventMask)PropertyChangeMask,
+                     HandlePropertyGone, closure);
+       XtFree((char*)req);
+       if (--ctx->ref_count == 0 && ctx->free_when_done)
+           XtFree((char*)ctx);
+    } else  { /* is this part of an incremental transfer? */
+       if (ctx->incremental) {
+            if (req->bytelength == 0)
+               AllSent(req);
+            else {
+               unsigned long size = MAX_SELECTION_INCR(ctx->dpy);
+               SendIncrement(req);
+               (*(XtConvertSelectionIncrProc)ctx->convert)
+                          (ctx->widget, &ctx->selection, &req->target,
+                           &req->type, &req->value,
+                           &req->bytelength, &req->format,
+                           &size, ctx->owner_closure, (XtPointer*)&req);
+               if (req->bytelength)
+                   req->bytelength = BYTELENGTH(req->bytelength, req->format);
+               req->offset = 0;
+           }
+       } else {
+           if (req->offset < req->bytelength)
+               SendIncrement(req);
+           else AllSent(req);
+       }
+#ifndef DEBUG_WO_TIMERS
+       {
+         XtAppContext app = XtWidgetToApplicationContext(req->widget);
+         req->timeout = XtAppAddTimeOut(app,
+                        app->selectionTimeout, OwnerTimedOut, (XtPointer)req);
+       }
+#endif
+    }
+}
+
+static void PrepareIncremental(
+    Request req,
+    Widget widget,
+    Window window,
+    Atom property,
+    Atom target,
+    Atom targetType,
+    XtPointer value,
+    unsigned long length,
+    int format)
+{
+       req->type = targetType;
+       req->value = value;
+       req->bytelength = BYTELENGTH(length,format);
+       req->format = format;
+       req->offset = 0;
+       req->target = target;
+       req->widget = widget;
+       req->allSent = FALSE;
+#ifndef DEBUG_WO_TIMERS
+       {
+       XtAppContext app = XtWidgetToApplicationContext(widget);
+       req->timeout = XtAppAddTimeOut(app,
+                        app->selectionTimeout, OwnerTimedOut, (XtPointer)req);
+       }
+#endif
+       AddHandler(req, (EventMask)PropertyChangeMask,
+                  HandlePropertyGone, (XtPointer)req);
+/* now send client INCR property */
+       XChangeProperty(req->ctx->dpy, window, req->property,
+                       req->ctx->prop_list->incr_atom,
+                       32, PropModeReplace,
+                       (unsigned char *)&req->bytelength, 1);
+}
+
+static Boolean GetConversion(
+    Select ctx,                        /* logical owner */
+    XSelectionRequestEvent* event,
+    Atom target,
+    Atom property,             /* requestor's property */
+    Widget widget)             /* physical owner (receives events) */
+{
+    XtPointer value = NULL;
+    unsigned long length;
+    int format;
+    Atom targetType;
+    Request req = XtNew(RequestRec);
+    Boolean timestamp_target = (target == ctx->prop_list->timestamp_atom);
+
+    req->ctx = ctx;
+    req->event = *event;
+    req->property = property;
+    req->requestor = event->requestor;
+
+    if (timestamp_target) {
+       value = __XtMalloc(sizeof(long));
+       *(long*)value = ctx->time;
+       targetType = XA_INTEGER;
+       length = 1;
+       format = 32;
+    }
+    else {
+       ctx->ref_count++;
+       if (ctx->incremental == TRUE) {
+            unsigned long size = MAX_SELECTION_INCR(ctx->dpy);
+            if ((*(XtConvertSelectionIncrProc)ctx->convert)
+                              (ctx->widget, &event->selection, &target,
+                               &targetType, &value, &length, &format,
+                               &size, ctx->owner_closure, (XtRequestId*)&req)
+                    == FALSE) {
+                XtFree((char*)req);
+                ctx->ref_count--;
+                return(FALSE);
+            }
+            StartProtectedSection(ctx->dpy, event->requestor);
+            PrepareIncremental(req, widget, event->requestor, property,
+                               target, targetType, value, length, format);
+            return(TRUE);
+       }
+       ctx->req = req;
+       if ((*ctx->convert)(ctx->widget, &event->selection, &target,
+                           &targetType, &value, &length, &format) == FALSE) {
+           XtFree((char*)req);
+           ctx->req = NULL;
+           ctx->ref_count--;
+           return(FALSE);
+       }
+       ctx->req = NULL;
+    }
+    StartProtectedSection(ctx->dpy, event->requestor);
+    if (BYTELENGTH(length,format) <= (unsigned long) MAX_SELECTION_INCR(ctx->dpy)) {
+       if (! timestamp_target) {
+           if (ctx->notify != NULL) {
+                 req->target = target;
+                 req->widget = widget;
+                 req->allSent = TRUE;
+#ifndef DEBUG_WO_TIMERS
+                 {
+                 XtAppContext app = XtWidgetToApplicationContext(req->widget);
+                 req->timeout = XtAppAddTimeOut(app,
+                        app->selectionTimeout, OwnerTimedOut, (XtPointer)req);
+                 }
+#endif
+                 AddHandler(req, (EventMask)PropertyChangeMask,
+                            HandlePropertyGone, (XtPointer)req);
+             }
+             else ctx->ref_count--;
+        }
+       XChangeProperty(ctx->dpy, event->requestor, property,
+                       targetType, format, PropModeReplace,
+                       (unsigned char *)value, (int)length);
+       /* free storage for client if no notify proc */
+       if (timestamp_target || ctx->notify == NULL) {
+           XtFree((char*)value);
+           XtFree((char*)req);
+       }
+    } else {
+        PrepareIncremental(req, widget, event->requestor, property,
+                           target, targetType, value, length, format);
+    }
+    return(TRUE);
+}
+
+/*ARGSUSED*/
+static void HandleSelectionEvents(
+    Widget widget,
+    XtPointer closure,
+    XEvent *event,
+    Boolean *cont)
+{
+    Select ctx;
+    XSelectionEvent ev;
+    Atom target;
+    int count;
+    Boolean writeback = FALSE;
+
+    ctx = (Select) closure;
+    switch (event->type) {
+      case SelectionClear:
+       /* if this event is not for the selection we registered for,
+        * don't do anything */
+       if (ctx->selection != event->xselectionclear.selection ||
+           ctx->serial > event->xselectionclear.serial)
+           break;
+       (void) LoseSelection(ctx, widget, event->xselectionclear.selection,
+                       event->xselectionclear.time);
+       break;
+      case SelectionRequest:
+       /* if this event is not for the selection we registered for,
+        * don't do anything */
+       if (ctx->selection != event->xselectionrequest.selection)
+           break;
+       ev.type = SelectionNotify;
+       ev.display = event->xselectionrequest.display;
+       ev.requestor = event->xselectionrequest.requestor;
+       ev.selection = event->xselectionrequest.selection;
+       ev.time = event->xselectionrequest.time;
+       ev.target = event->xselectionrequest.target;
+       if (event->xselectionrequest.property == None) /* obsolete requestor */
+          event->xselectionrequest.property = event->xselectionrequest.target;
+       if (ctx->widget != widget || ctx->was_disowned
+          || ((event->xselectionrequest.time != CurrentTime)
+               && (event->xselectionrequest.time < ctx->time))) {
+           ev.property = None;
+           StartProtectedSection(ev.display, ev.requestor);
+       } else {
+          if (ev.target == ctx->prop_list->indirect_atom) {
+             IndirectPair *p;
+             int format;
+             unsigned long bytesafter, length;
+             unsigned char *value;
+             ev.property = event->xselectionrequest.property;
+             StartProtectedSection(ev.display, ev.requestor);
+             (void) XGetWindowProperty(ev.display, ev.requestor,
+                       event->xselectionrequest.property, 0L, 1000000,
+                       False,(Atom)AnyPropertyType, &target, &format, &length,
+                       &bytesafter, &value);
+             count = BYTELENGTH(length, format) / sizeof(IndirectPair);
+             for (p = (IndirectPair *)value; count; p++, count--) {
+                 EndProtectedSection(ctx->dpy);
+                 if (!GetConversion(ctx, (XSelectionRequestEvent*)event,
+                                    p->target, p->property, widget)) {
+
+                       p->target = None;
+                       writeback = TRUE;
+                       StartProtectedSection(ctx->dpy, ev.requestor);
+                 }
+             }
+             if (writeback)
+               XChangeProperty(ev.display, ev.requestor,
+                       event->xselectionrequest.property, target,
+                       format, PropModeReplace, value, (int)length);
+             XFree((char *)value);
+         } else /* not multiple */ {
+              if (GetConversion(ctx, (XSelectionRequestEvent*)event,
+                                event->xselectionrequest.target,
+                                event->xselectionrequest.property,
+                                widget))
+                  ev.property = event->xselectionrequest.property;
+              else {
+                  ev.property = None;
+                  StartProtectedSection(ctx->dpy, ev.requestor);
+              }
+          }
+      }
+      (void) XSendEvent(ctx->dpy, ev.requestor, False, (unsigned long)NULL,
+                  (XEvent *) &ev);
+
+      EndProtectedSection(ctx->dpy);
+
+      break;
+    }
+}
+
+static Boolean OwnSelection(
+    Widget widget,
+    Atom selection,
+    Time time,
+    XtConvertSelectionProc convert,
+    XtLoseSelectionProc lose,
+    XtSelectionDoneProc notify,
+    XtCancelConvertSelectionProc cancel,
+    XtPointer closure,
+    Boolean incremental)
+{
+    Select ctx;
+    Select oldctx = NULL;
+
+    if (!XtIsRealized(widget)) return False;
+
+    ctx = FindCtx(XtDisplay(widget), selection);
+    if (ctx->widget != widget || ctx->time != time ||
+       ctx->ref_count || ctx->was_disowned)
+    {
+       Boolean replacement = FALSE;
+       Window window = XtWindow(widget);
+       unsigned long serial = XNextRequest(ctx->dpy);
+        XSetSelectionOwner(ctx->dpy, selection, window, time);
+        if (XGetSelectionOwner(ctx->dpy, selection) != window)
+           return FALSE;
+       if (ctx->ref_count) {   /* exchange is in-progress */
+#ifdef DEBUG_ACTIVE
+           printf( "Active exchange for widget \"%s\"; selection=0x%lx, ref_count=%d\n",
+                   XtName(widget), (long)selection, ctx->ref_count );
+#endif
+           if (ctx->widget != widget ||
+               ctx->convert != convert ||
+               ctx->loses != lose ||
+               ctx->notify != notify ||
+               ctx->owner_cancel != cancel ||
+               ctx->incremental != incremental ||
+               ctx->owner_closure != closure)
+           {
+               if (ctx->widget == widget) {
+                   XtRemoveEventHandler(widget, (EventMask)0, TRUE,
+                                       HandleSelectionEvents, (XtPointer)ctx);
+                   XtRemoveCallback(widget, XtNdestroyCallback,
+                                    WidgetDestroyed, (XtPointer)ctx);
+                   replacement = TRUE;
+               }
+               else if (!ctx->was_disowned) {
+                   oldctx = ctx;
+               }
+               ctx->free_when_done = TRUE;
+               ctx = NewContext(XtDisplay(widget), selection);
+           }
+           else if (!ctx->was_disowned) { /* current owner is new owner */
+               ctx->time = time;
+               return TRUE;
+           }
+       }
+       if (ctx->widget != widget || ctx->was_disowned || replacement) {
+           if (ctx->widget && !ctx->was_disowned && !replacement) {
+               oldctx = ctx;
+               oldctx->free_when_done = TRUE;
+               ctx = NewContext(XtDisplay(widget), selection);
+           }
+           XtAddEventHandler(widget, (EventMask)0, TRUE,
+                             HandleSelectionEvents, (XtPointer)ctx);
+           XtAddCallback(widget, XtNdestroyCallback,
+                         WidgetDestroyed, (XtPointer)ctx);
+       }
+       ctx->widget = widget;   /* Selection offically changes hands. */
+       ctx->time = time;
+       ctx->serial = serial;
+    }
+    ctx->convert = convert;
+    ctx->loses = lose;
+    ctx->notify = notify;
+    ctx->owner_cancel = cancel;
+    ctx->incremental = incremental;
+    ctx->owner_closure = closure;
+    ctx->was_disowned = FALSE;
+
+    /* Defer calling the previous selection owner's lose selection procedure
+     * until the new selection is established, to allow the previous
+     * selection owner to ask for the new selection to be converted in
+     * the lose selection procedure.  The context pointer is the closure
+     * of the event handler and the destroy callback, so the old context
+     * pointer and the record contents must be preserved for LoseSelection.
+     */
+    if (oldctx) {
+       (void) LoseSelection(oldctx, oldctx->widget, selection, oldctx->time);
+       if (!oldctx->ref_count && oldctx->free_when_done)
+           XtFree((char*)oldctx);
+    }
+    return TRUE;
+}
+
+
+Boolean XtOwnSelection(
+    Widget widget,
+    Atom selection,
+    Time time,
+    XtConvertSelectionProc convert,
+    XtLoseSelectionProc lose,
+    XtSelectionDoneProc notify)
+{
+    Boolean retval;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    retval = OwnSelection(widget, selection, time, convert, lose, notify,
+                       (XtCancelConvertSelectionProc)NULL,
+                       (XtPointer)NULL, FALSE);
+    UNLOCK_APP(app);
+    return retval;
+}
+
+
+Boolean XtOwnSelectionIncremental(
+    Widget widget,
+    Atom selection,
+    Time time,
+    XtConvertSelectionIncrProc convert,
+    XtLoseSelectionIncrProc lose,
+    XtSelectionDoneIncrProc notify,
+    XtCancelConvertSelectionProc cancel,
+    XtPointer closure)
+{
+    Boolean retval;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    retval = OwnSelection(widget, selection, time,
+                       (XtConvertSelectionProc)convert,
+                       (XtLoseSelectionProc)lose,
+                       (XtSelectionDoneProc)notify,
+                       cancel, closure, TRUE);
+    UNLOCK_APP(app);
+    return retval;
+}
+
+
+void XtDisownSelection(
+    Widget widget,
+    Atom selection,
+    Time time)
+{
+    Select ctx;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    ctx = FindCtx(XtDisplay(widget), selection);
+    if (LoseSelection(ctx, widget, selection, time))
+       XSetSelectionOwner(XtDisplay(widget), selection, None, time);
+    UNLOCK_APP(app);
+}
+
+/* Selection Requestor code */
+
+static Boolean IsINCRtype(
+    CallBackInfo info,
+    Window window,
+    Atom prop)
+{
+    unsigned long bytesafter;
+    unsigned long length;
+    int format;
+    Atom type;
+    unsigned char *value;
+
+    if (prop == None) return False;
+
+    (void)XGetWindowProperty(XtDisplay(info->widget), window, prop, 0L, 0L,
+                            False, info->ctx->prop_list->incr_atom,
+                            &type, &format, &length, &bytesafter, &value);
+
+    return (type == info->ctx->prop_list->incr_atom);
+}
+
+/*ARGSUSED*/
+static void ReqCleanup(
+    Widget widget,
+    XtPointer closure,
+    XEvent *ev,
+    Boolean *cont)
+{
+    CallBackInfo info = (CallBackInfo)closure;
+    unsigned long bytesafter, length;
+    char *value;
+    int format;
+    Atom target;
+
+    if (ev->type == SelectionNotify) {
+       XSelectionEvent *event = (XSelectionEvent *) ev;
+       if (!MATCH_SELECT(event, info)) return; /* not really for us */
+         XtRemoveEventHandler(widget, (EventMask)0, TRUE,
+                          ReqCleanup, (XtPointer) info );
+       if (IsINCRtype(info, XtWindow(widget), event->property)) {
+           info->proc = HandleGetIncrement;
+           XtAddEventHandler(info->widget, (EventMask) PropertyChangeMask,
+                             FALSE, ReqCleanup, (XtPointer) info);
+       } else {
+          if (event->property != None)
+               XDeleteProperty(event->display, XtWindow(widget),
+                               event->property);
+           FreeSelectionProperty(XtDisplay(widget), info->property);
+          FreeInfo(info);
+       }
+    } else if ((ev->type == PropertyNotify) &&
+               (ev->xproperty.state == PropertyNewValue) &&
+               (ev->xproperty.atom == info->property)) {
+       XPropertyEvent *event = (XPropertyEvent *) ev;
+        (void) XGetWindowProperty(event->display, XtWindow(widget),
+                          event->atom, 0L, 1000000, True, AnyPropertyType,
+                          &target, &format, &length, &bytesafter,
+                          (unsigned char **) &value);
+       XFree(value);
+       if (length == 0) {
+           XtRemoveEventHandler(widget, (EventMask) PropertyChangeMask, FALSE,
+                          ReqCleanup, (XtPointer) info );
+           FreeSelectionProperty(XtDisplay(widget), info->property);
+          XtFree(info->value); /* requestor never got this, so free now */
+          FreeInfo(info);
+       }
+    }
+}
+
+/* ARGSUSED */
+static void ReqTimedOut(
+    XtPointer closure,
+    XtIntervalId   *id)
+{
+    XtPointer value = NULL;
+    unsigned long length = 0;
+    int format = 8;
+    Atom resulttype = XT_CONVERT_FAIL;
+    CallBackInfo info = (CallBackInfo)closure;
+    unsigned long bytesafter;
+    unsigned long proplength;
+    Atom type;
+    IndirectPair *pairs;
+    XtPointer *c;
+    int i;
+
+    if (*info->target == info->ctx->prop_list->indirect_atom) {
+        (void) XGetWindowProperty(XtDisplay(info->widget),
+                          XtWindow(info->widget), info->property, 0L,
+                          10000000, True, AnyPropertyType, &type, &format,
+                          &proplength, &bytesafter, (unsigned char **) &pairs);
+       XFree((char*)pairs);
+       for (proplength = proplength / IndirectPairWordSize, i = 0, c = info->req_closure;
+                  proplength; proplength--, c++, i++)
+           (*info->callbacks[i])(info->widget, *c,
+                 &info->ctx->selection, &resulttype, value, &length, &format);
+    } else {
+       (*info->callbacks[0])(info->widget, *info->req_closure,
+           &info->ctx->selection, &resulttype, value, &length, &format);
+    }
+
+    /* change event handlers for straggler events */
+    if (info->proc == (XtEventHandler)HandleSelectionReplies) {
+        XtRemoveEventHandler(info->widget, (EventMask)0,
+                       TRUE, info->proc, (XtPointer) info);
+       XtAddEventHandler(info->widget, (EventMask)0, TRUE,
+               ReqCleanup, (XtPointer) info);
+    } else {
+        XtRemoveEventHandler(info->widget,(EventMask) PropertyChangeMask,
+                       FALSE, info->proc, (XtPointer) info);
+       XtAddEventHandler(info->widget, (EventMask) PropertyChangeMask,
+               FALSE, ReqCleanup, (XtPointer) info);
+    }
+
+}
+
+/*ARGSUSED*/
+static void HandleGetIncrement(
+    Widget widget,
+    XtPointer closure,
+    XEvent *ev,
+    Boolean *cont)
+{
+    XPropertyEvent *event = (XPropertyEvent *) ev;
+    CallBackInfo info = (CallBackInfo) closure;
+    Select ctx = info->ctx;
+    char *value;
+    unsigned long bytesafter;
+    unsigned long length;
+    int bad;
+    int n = info->current;
+
+    if ((event->state != PropertyNewValue) || (event->atom != info->property))
+        return;
+
+    bad = XGetWindowProperty(event->display, XtWindow(widget),
+                            event->atom, 0L,
+                            10000000, True, AnyPropertyType, &info->type,
+                            &info->format, &length, &bytesafter,
+                            (unsigned char **) &value);
+    if (bad)
+      return;
+#ifndef DEBUG_WO_TIMERS
+    XtRemoveTimeOut(info->timeout);
+#endif
+    if (length == 0) {
+       unsigned long u_offset = NUMELEM(info->offset, info->format);
+       (*info->callbacks[n])(widget, *info->req_closure, &ctx->selection,
+                            &info->type,
+                            (info->offset == 0 ? value : info->value),
+                            &u_offset, &info->format);
+       /* assert ((info->offset != 0) == (info->incremental[n]) */
+       if (info->offset != 0) XFree(value);
+       XtRemoveEventHandler(widget, (EventMask) PropertyChangeMask, FALSE,
+               HandleGetIncrement, (XtPointer) info);
+       FreeSelectionProperty(event->display, info->property);
+       FreeInfo(info);
+    } else { /* add increment to collection */
+      if (info->incremental[n]) {
+#ifdef XT_COPY_SELECTION
+         int size = BYTELENGTH(length, info->format) + 1;
+         char *tmp = __XtMalloc((Cardinal) size);
+         (void) memmove(tmp, value, size);
+         XFree(value);
+         value = tmp;
+#endif
+        (*info->callbacks[n])(widget, *info->req_closure, &ctx->selection,
+                             &info->type, value, &length, &info->format);
+      } else {
+         int size = BYTELENGTH(length, info->format);
+         if (info->offset + size > info->bytelength) {
+             /* allocate enough for this and the next increment */
+             info->bytelength = info->offset + size * 2;
+             info->value = XtRealloc(info->value,
+                                     (Cardinal) info->bytelength);
+         }
+         (void) memmove(&info->value[info->offset], value, size);
+         info->offset += size;
+         XFree(value);
+      }
+     /* reset timer */
+#ifndef DEBUG_WO_TIMERS
+     {
+     XtAppContext app = XtWidgetToApplicationContext(info->widget);
+     info->timeout = XtAppAddTimeOut(app,
+                        app->selectionTimeout, ReqTimedOut, (XtPointer) info);
+     }
+#endif
+   }
+}
+
+
+static void HandleNone(
+    Widget widget,
+    XtSelectionCallbackProc callback,
+    XtPointer closure,
+    Atom selection)
+{
+    unsigned long length = 0;
+    int format = 8;
+    Atom type = None;
+
+    (*callback)(widget, closure, &selection,
+               &type, NULL, &length, &format);
+}
+
+
+static long IncrPropSize(
+     Widget widget,
+     unsigned char* value,
+     int format,
+     unsigned long length)
+{
+    unsigned long size;
+    if (format == 32) {
+       size = ((long*)value)[length-1]; /* %%% what order for longs? */
+       return size;
+    }
+    else {
+       XtAppWarningMsg( XtWidgetToApplicationContext(widget),
+                       "badFormat","xtGetSelectionValue",XtCXtToolkitError,
+       "Selection owner returned type INCR property with format != 32",
+                       (String*)NULL, (Cardinal*)NULL );
+       return 0;
+    }
+}
+
+
+static
+Boolean HandleNormal(
+    Display *dpy,
+    Widget widget,
+    Atom property,
+    CallBackInfo info,
+    XtPointer closure,
+    Atom selection)
+{
+    unsigned long bytesafter;
+    unsigned long length;
+    int format;
+    Atom type;
+    unsigned char *value;
+    int number = info->current;
+
+    (void) XGetWindowProperty(dpy, XtWindow(widget), property, 0L,
+                             10000000, False, AnyPropertyType,
+                             &type, &format, &length, &bytesafter, &value);
+
+    if (type == info->ctx->prop_list->incr_atom) {
+       unsigned long size = IncrPropSize(widget, value, format, length);
+       XFree((char *)value);
+       if (info->property != property) {
+           /* within MULTIPLE */
+           CallBackInfo ninfo;
+           ninfo = MakeInfo(info->ctx, &info->callbacks[number],
+                            &info->req_closure[number], 1, widget,
+                            info->time, &info->incremental[number], &property);
+           ninfo->target = (Atom *) __XtMalloc((unsigned) sizeof(Atom));
+           *ninfo->target = info->target[number + 1];
+           info = ninfo;
+       }
+       HandleIncremental(dpy, widget, property, info, size);
+       return FALSE;
+    }
+
+    XDeleteProperty(dpy, XtWindow(widget), property);
+#ifdef XT_COPY_SELECTION
+    if (value) {   /* it could have been deleted after the SelectionNotify */
+       int size = BYTELENGTH(length, info->format) + 1;
+       char *tmp = __XtMalloc((Cardinal) size);
+       (void) memmove(tmp, value, size);
+       XFree(value);
+       value = (unsigned char *) tmp;
+    }
+#endif
+    (*info->callbacks[number])(widget, closure, &selection,
+                              &type, (XtPointer)value, &length, &format);
+
+    if (info->incremental[number]) {
+       /* let requestor know the whole thing has been received */
+       value = (unsigned char*)__XtMalloc((unsigned)1);
+       length = 0;
+       (*info->callbacks[number])(widget, closure, &selection,
+                                  &type, (XtPointer)value, &length, &format);
+    }
+    return TRUE;
+}
+
+static void HandleIncremental(
+    Display *dpy,
+    Widget widget,
+    Atom property,
+    CallBackInfo info,
+    unsigned long size)
+{
+    XtAddEventHandler(widget, (EventMask) PropertyChangeMask, FALSE,
+                     HandleGetIncrement, (XtPointer) info);
+
+    /* now start the transfer */
+    XDeleteProperty(dpy, XtWindow(widget), property);
+    XFlush(dpy);
+
+    info->bytelength = size;
+    if (info->incremental[info->current]) /* requestor wants incremental too */
+       info->value = NULL;     /* so no need for buffer to assemble value */
+    else
+       info->value = (char *) __XtMalloc((unsigned) info->bytelength);
+    info->offset = 0;
+
+    /* reset the timer */
+    info->proc = HandleGetIncrement;
+#ifndef DEBUG_WO_TIMERS
+    {
+    XtAppContext app = XtWidgetToApplicationContext(info->widget);
+    info->timeout = XtAppAddTimeOut(app,
+                        app->selectionTimeout, ReqTimedOut, (XtPointer) info);
+    }
+#endif
+}
+
+/*ARGSUSED*/
+static void HandleSelectionReplies(
+    Widget widget,
+    XtPointer closure,
+    XEvent *ev,
+    Boolean *cont)
+{
+    XSelectionEvent *event = (XSelectionEvent *) ev;
+    Display *dpy = event->display;
+    CallBackInfo info = (CallBackInfo) closure;
+    Select ctx = info->ctx;
+    IndirectPair *pairs, *p;
+    unsigned long bytesafter;
+    unsigned long length;
+    int format;
+    Atom type;
+    XtPointer *c;
+
+    if (event->type != SelectionNotify) return;
+    if (!MATCH_SELECT(event, info)) return; /* not really for us */
+#ifndef DEBUG_WO_TIMERS
+    XtRemoveTimeOut(info->timeout);
+#endif
+    XtRemoveEventHandler(widget, (EventMask)0, TRUE,
+               HandleSelectionReplies, (XtPointer) info );
+    if (event->target == ctx->prop_list->indirect_atom) {
+        (void) XGetWindowProperty(dpy, XtWindow(widget), info->property, 0L,
+                          10000000, True, AnyPropertyType, &type, &format,
+                          &length, &bytesafter, (unsigned char **) &pairs);
+       for (length = length / IndirectPairWordSize, p = pairs,
+           c = info->req_closure;
+           length; length--, p++, c++, info->current++) {
+           if (event->property == None || format != 32 || p->target == None
+               || /* bug compatibility */ p->property == None) {
+               HandleNone(widget, info->callbacks[info->current],
+                          *c, event->selection);
+               if (p->property != None)
+                    FreeSelectionProperty(XtDisplay(widget), p->property);
+           } else {
+               if (HandleNormal(dpy, widget, p->property, info, *c,
+                                event->selection)) {
+                   FreeSelectionProperty(XtDisplay(widget), p->property);
+               }
+           }
+       }
+       XFree((char*)pairs);
+       FreeSelectionProperty(dpy, info->property);
+       FreeInfo(info);
+    } else if (event->property == None) {
+       HandleNone(widget, info->callbacks[0], *info->req_closure, event->selection);
+        FreeSelectionProperty(XtDisplay(widget), info->property);
+       FreeInfo(info);
+    } else {
+       if (HandleNormal(dpy, widget, event->property, info,
+                        *info->req_closure, event->selection)) {
+           FreeSelectionProperty(XtDisplay(widget), info->property);
+           FreeInfo(info);
+       }
+    }
+}
+
+static void DoLocalTransfer(
+    Request req,
+    Atom selection,
+    Atom target,
+    Widget widget,             /* The widget requesting the value. */
+    XtSelectionCallbackProc callback,
+    XtPointer closure, /* the closure for the callback, not the conversion */
+    Boolean incremental,
+    Atom property)
+{
+    Select ctx = req->ctx;
+    XtPointer value = NULL, temp, total = NULL;
+    unsigned long length;
+    int format;
+    Atom resulttype;
+    unsigned long totallength = 0;
+
+        req->event.type = 0;
+        req->event.target = target;
+        req->event.property = req->property = property;
+        req->event.requestor = req->requestor = XtWindow(widget);
+
+       if (ctx->incremental) {
+          unsigned long size = MAX_SELECTION_INCR(ctx->dpy);
+          if (!(*(XtConvertSelectionIncrProc)ctx->convert)
+                          (ctx->widget, &selection, &target,
+                           &resulttype, &value, &length, &format,
+                           &size, ctx->owner_closure, (XtRequestId*)&req)) {
+              HandleNone(widget, callback, closure, selection);
+          }
+          else {
+               if (incremental) {
+                 Boolean allSent = FALSE;
+                 while (!allSent) {
+                     if (ctx->notify && (value != NULL)) {
+                       int bytelength = BYTELENGTH(length,format);
+                       /* both sides think they own this storage */
+                       temp = __XtMalloc((unsigned)bytelength);
+                       (void) memmove(temp, value, bytelength);
+                       value = temp;
+                     }
+                     /* use care; older clients were never warned that
+                      * they must return a value even if length==0
+                      */
+                    if (value == NULL) value = __XtMalloc((unsigned)1);
+                    (*callback)(widget, closure, &selection,
+                       &resulttype, value, &length, &format);
+                    if (length) {
+                        /* should owner be notified on end-of-piece?
+                         * Spec is unclear, but non-local transfers don't.
+                         */
+                        (*(XtConvertSelectionIncrProc)ctx->convert)
+                                       (ctx->widget, &selection, &target,
+                                        &resulttype, &value, &length, &format,
+                                        &size, ctx->owner_closure,
+                                        (XtRequestId*)&req);
+                    }
+                    else allSent = TRUE;
+                 }
+               } else {
+                 while (length) {
+                   int bytelength = BYTELENGTH(length, format);
+                   total = XtRealloc(total,
+                           (unsigned) (totallength += bytelength));
+                   (void) memmove((char*)total + totallength - bytelength,
+                           value,
+                           bytelength);
+                   (*(XtConvertSelectionIncrProc)ctx->convert)
+                          (ctx->widget, &selection, &target,
+                           &resulttype, &value, &length, &format,
+                           &size, ctx->owner_closure, (XtRequestId*)&req);
+                 }
+                 if (total == NULL) total = __XtMalloc(1);
+                 totallength = NUMELEM(totallength, format);
+                 (*callback)(widget, closure, &selection, &resulttype,
+                   total,  &totallength, &format);
+             }
+             if (ctx->notify)
+                 (*(XtSelectionDoneIncrProc)ctx->notify)
+                               (ctx->widget, &selection, &target,
+                                (XtRequestId*)&req, ctx->owner_closure);
+             else XtFree((char*)value);
+         }
+       } else { /* not incremental owner */
+         if (!(*ctx->convert)(ctx->widget, &selection, &target,
+                            &resulttype, &value, &length, &format)) {
+           HandleNone(widget, callback, closure, selection);
+         } else {
+             if (ctx->notify && (value != NULL)) {
+                int bytelength = BYTELENGTH(length,format);
+               /* both sides think they own this storage; better copy */
+               temp = __XtMalloc((unsigned)bytelength);
+               (void) memmove(temp, value, bytelength);
+               value = temp;
+             }
+             if (value == NULL) value = __XtMalloc((unsigned)1);
+             (*callback)(widget, closure, &selection, &resulttype,
+                         value, &length, &format);
+             if (ctx->notify)
+                (*ctx->notify)(ctx->widget, &selection, &target);
+         }
+      }
+}
+
+static void GetSelectionValue(
+    Widget widget,
+    Atom selection,
+    Atom target,
+    XtSelectionCallbackProc callback,
+    XtPointer closure,
+    Time time,
+    Boolean incremental,
+    Atom property)
+{
+    Select ctx;
+    CallBackInfo info;
+    Atom properties[1];
+
+    properties[0] = property;
+
+    ctx = FindCtx(XtDisplay(widget), selection);
+    if (ctx->widget && !ctx->was_disowned) {
+       RequestRec req;
+       ctx->req = &req;
+       req.ctx = ctx;
+       req.event.time = time;
+       ctx->ref_count++;
+       DoLocalTransfer(&req, selection, target, widget,
+                       callback, closure, incremental, property);
+       if (--ctx->ref_count == 0 && ctx->free_when_done)
+           XtFree((char*)ctx);
+       else
+           ctx->req = NULL;
+    }
+    else {
+       info = MakeInfo(ctx, &callback, &closure, 1, widget,
+                       time, &incremental, properties);
+       info->target = (Atom *)__XtMalloc((unsigned) sizeof(Atom));
+        *(info->target) = target;
+       RequestSelectionValue(info, selection, target);
+    }
+}
+
+
+void XtGetSelectionValue(
+    Widget widget,
+    Atom selection,
+    Atom target,
+    XtSelectionCallbackProc callback,
+    XtPointer closure,
+    Time time)
+{
+    Atom property;
+    Boolean incr = False;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    property = GetParamInfo(widget, selection);
+    RemoveParamInfo(widget, selection);
+
+    if (IsGatheringRequest(widget, selection)) {
+      AddSelectionRequests(widget, selection, 1, &target, &callback, 1,
+                          &closure, &incr, &property);
+    } else {
+      GetSelectionValue(widget, selection, target, callback,
+                       closure, time, FALSE, property);
+    }
+    UNLOCK_APP(app);
+}
+
+
+void XtGetSelectionValueIncremental(
+    Widget widget,
+    Atom selection,
+    Atom target,
+    XtSelectionCallbackProc callback,
+    XtPointer closure,
+    Time time)
+{
+    Atom property;
+    Boolean incr = TRUE;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    property = GetParamInfo(widget, selection);
+    RemoveParamInfo(widget, selection);
+
+    if (IsGatheringRequest(widget, selection)) {
+      AddSelectionRequests(widget, selection, 1, &target, &callback, 1,
+                          &closure, &incr, &property);
+    } else {
+      GetSelectionValue(widget, selection, target, callback,
+                       closure, time, TRUE, property);
+    }
+
+    UNLOCK_APP(app);
+}
+
+
+static void GetSelectionValues(
+    Widget widget,
+    Atom selection,
+    Atom *targets,
+    int count,
+    XtSelectionCallbackProc *callbacks,
+    int num_callbacks,
+    XtPointer *closures,
+    Time time,
+    Boolean *incremental,
+    Atom *properties)
+{
+    Select ctx;
+    CallBackInfo info;
+    IndirectPair *pairs, *p;
+    Atom *t;
+
+    if (count == 0) return;
+    ctx = FindCtx(XtDisplay(widget), selection);
+    if (ctx->widget && !ctx->was_disowned) {
+        int j, i;
+       RequestRec req;
+       ctx->req = &req;
+       req.ctx = ctx;
+       req.event.time = time;
+       ctx->ref_count++;
+       for (i = 0, j = 0; count; count--, i++, j++ ) {
+         if (j >= num_callbacks) j = 0;
+
+         DoLocalTransfer(&req, selection, targets[i], widget,
+                         callbacks[j], closures[i], incremental[i],
+                         properties ? properties[i] : None);
+
+       }
+       if (--ctx->ref_count == 0 && ctx->free_when_done)
+           XtFree((char*)ctx);
+       else
+           ctx->req = NULL;
+    } else {
+        XtSelectionCallbackProc *passed_callbacks;
+       XtSelectionCallbackProc stack_cbs[32];
+        int i = 0, j = 0;
+
+       passed_callbacks = (XtSelectionCallbackProc *)
+         XtStackAlloc(sizeof(XtSelectionCallbackProc) * count, stack_cbs);
+
+       /* To deal with the old calls from XtGetSelectionValues* we
+          will repeat however many callbacks have been passed into
+          the array */
+       for(i = 0; i < count; i++) {
+         if (j >= num_callbacks) j = 0;
+         passed_callbacks[i] = callbacks[j];
+         j++;
+       }
+       info = MakeInfo(ctx, passed_callbacks, closures, count, widget,
+                       time, incremental, properties);
+       XtStackFree((XtPointer) passed_callbacks, stack_cbs);
+
+       info->target = (Atom *)__XtMalloc((unsigned) ((count+1) * sizeof(Atom)));
+        (*info->target) = ctx->prop_list->indirect_atom;
+       (void) memmove((char *) info->target+sizeof(Atom), (char *) targets,
+                      count * sizeof(Atom));
+       pairs = (IndirectPair*)__XtMalloc((unsigned)(count*sizeof(IndirectPair)));
+       for (p = &pairs[count-1], t = &targets[count-1], i = count - 1;
+            p >= pairs;  p--, t--, i--) {
+          p->target = *t;
+          if (properties == NULL || properties[i] == None) {
+            p->property = GetSelectionProperty(XtDisplay(widget));
+            XDeleteProperty(XtDisplay(widget), XtWindow(widget),
+                            p->property);
+          } else {
+            p->property = properties[i];
+          }
+       }
+       XChangeProperty(XtDisplay(widget), XtWindow(widget),
+                       info->property, info->property,
+                       32, PropModeReplace, (unsigned char *) pairs,
+                       count * IndirectPairWordSize);
+       XtFree((char*)pairs);
+       RequestSelectionValue(info, selection, ctx->prop_list->indirect_atom);
+    }
+}
+
+
+void XtGetSelectionValues(
+    Widget widget,
+    Atom selection,
+    Atom *targets,
+    int count,
+    XtSelectionCallbackProc callback,
+    XtPointer *closures,
+    Time time)
+{
+    Boolean incremental_values[32];
+    Boolean *incremental;
+    int i;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    incremental = XtStackAlloc(count * sizeof(Boolean), incremental_values);
+    for(i = 0; i < count; i++) incremental[i] = FALSE;
+    if (IsGatheringRequest(widget, selection)) {
+      AddSelectionRequests(widget, selection, count, targets, &callback,
+                          1, closures, incremental, NULL);
+    } else {
+      GetSelectionValues(widget, selection, targets, count, &callback, 1,
+                        closures, time, incremental, NULL);
+    }
+    XtStackFree((XtPointer) incremental, incremental_values);
+    UNLOCK_APP(app);
+}
+
+
+void XtGetSelectionValuesIncremental(
+    Widget widget,
+    Atom selection,
+    Atom *targets,
+    int count,
+    XtSelectionCallbackProc callback,
+    XtPointer *closures,
+    Time time)
+{
+    Boolean incremental_values[32];
+    Boolean *incremental;
+    int i;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    incremental = XtStackAlloc(count * sizeof(Boolean), incremental_values);
+    for(i = 0; i < count; i++) incremental[i] = TRUE;
+    if (IsGatheringRequest(widget, selection)) {
+      AddSelectionRequests(widget, selection, count, targets, &callback,
+                          1, closures, incremental, NULL);
+    } else {
+      GetSelectionValues(widget, selection, targets, count,
+                        &callback, 1, closures, time, incremental, NULL);
+    }
+    XtStackFree((XtPointer) incremental, incremental_values);
+    UNLOCK_APP(app);
+}
+
+
+static Request GetRequestRecord(
+    Widget widget,
+    Atom selection,
+    XtRequestId id)
+{
+    Request req = (Request)id;
+    Select ctx = NULL;
+
+    if (   (req == NULL
+           && ((ctx = FindCtx( XtDisplay(widget), selection )) == NULL
+               || ctx->req == NULL
+               || ctx->selection != selection
+               || ctx->widget == NULL))
+       || (req != NULL
+           && (req->ctx == NULL
+               || req->ctx->selection != selection
+               || req->ctx->widget != widget)))
+    {
+       String params = XtName(widget);
+       Cardinal num_params = 1;
+       XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+                        "notInConvertSelection", "xtGetSelectionRequest",
+                        XtCXtToolkitError,
+                        "XtGetSelectionRequest or XtGetSelectionParameters called for widget \"%s\" outside of ConvertSelection proc",
+                        &params, &num_params
+                      );
+       return NULL;
+    }
+
+    if (req == NULL) {
+       /* non-incremental owner; only one request can be
+        * outstanding at a time, so it's safe to keep ptr in ctx */
+       req = ctx->req;
+    }
+    return req;
+}
+
+XSelectionRequestEvent *XtGetSelectionRequest(
+    Widget widget,
+    Atom selection,
+    XtRequestId id)
+{
+    Request req = (Request)id;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+
+    req = GetRequestRecord(widget, selection, id);
+
+    if (! req) {
+       UNLOCK_APP(app);
+       return (XSelectionRequestEvent*) NULL;
+    }
+
+    if (req->event.type == 0) {
+       /* owner is local; construct the remainder of the event */
+       req->event.type = SelectionRequest;
+       req->event.serial = LastKnownRequestProcessed(XtDisplay(widget));
+       req->event.send_event = True;
+       req->event.display = XtDisplay(widget);
+       req->event.owner = XtWindow(req->ctx->widget);
+       req->event.selection = selection;
+    }
+    UNLOCK_APP(app);
+    return &req->event;
+}
+
+/* Property atom access */
+Atom XtReservePropertyAtom(
+     Widget w)
+{
+  return(GetSelectionProperty(XtDisplay(w)));
+}
+
+void XtReleasePropertyAtom(
+     Widget w,
+     Atom atom)
+{
+  FreeSelectionProperty(XtDisplay(w), atom);
+}
+
+
+/* Multiple utilities */
+
+/* All requests are put in a single list per widget.  It is
+   very unlikely anyone will be gathering multiple MULTIPLE
+   requests at the same time,  so the loss in efficiency for
+   this case is acceptable */
+
+/* Queue one or more requests to the one we're gathering */
+static void AddSelectionRequests(
+     Widget wid,
+     Atom sel,
+     int count,
+     Atom *targets,
+     XtSelectionCallbackProc *callbacks,
+     int num_cb,
+     XtPointer *closures,
+     Boolean *incrementals,
+     Atom *properties)
+{
+  QueuedRequestInfo qi;
+  Window window = XtWindow(wid);
+  Display *dpy = XtDisplay(wid);
+
+  LOCK_PROCESS;
+  if (multipleContext == 0) multipleContext = XUniqueContext();
+
+  qi = NULL;
+  (void) XFindContext(dpy, window, multipleContext, (XPointer*) &qi);
+
+  if (qi != NULL) {
+    QueuedRequest *req = qi->requests;
+    int start = qi->count;
+    int i = 0;
+    int j = 0;
+
+    qi->count += count;
+    req = (QueuedRequest*) XtRealloc((char*) req,
+                                    (start + count) *
+                                    sizeof(QueuedRequest));
+    while(i < count) {
+      QueuedRequest newreq = (QueuedRequest)
+       __XtMalloc(sizeof(QueuedRequestRec));
+      newreq->selection = sel;
+      newreq->target = targets[i];
+      if (properties != NULL)
+       newreq->param = properties[i];
+      else {
+       newreq->param = GetSelectionProperty(dpy);
+       XDeleteProperty(dpy, window, newreq->param);
+      }
+      newreq->callback = callbacks[j];
+      newreq->closure = closures[i];
+      newreq->incremental = incrementals[i];
+
+      req[start] = newreq;
+      start++;
+      i++;
+      j++;
+      if (j > num_cb) j = 0;
+    }
+
+    qi->requests = req;
+  } else {
+    /* Impossible */
+  }
+
+  UNLOCK_PROCESS;
+}
+
+/* Only call IsGatheringRequest when we have a lock already */
+
+static Boolean IsGatheringRequest(
+     Widget wid,
+     Atom sel)
+{
+  QueuedRequestInfo qi;
+  Window window = XtWindow(wid);
+  Display *dpy = XtDisplay(wid);
+  Boolean found = False;
+  int i;
+
+  if (multipleContext == 0) multipleContext = XUniqueContext();
+
+  qi = NULL;
+  (void) XFindContext(dpy, window, multipleContext, (XPointer*) &qi);
+
+  if (qi != NULL) {
+    i = 0;
+    while(qi->selections[i] != None) {
+      if (qi->selections[i] == sel) {
+       found = True;
+       break;
+      }
+      i++;
+    }
+  }
+
+  return(found);
+}
+
+/* Cleanup request scans the request queue and releases any
+   properties queued, and removes any requests queued */
+static void CleanupRequest(
+     Display *dpy,
+     QueuedRequestInfo qi,
+     Atom sel)
+{
+  int i, j, n;
+
+  i = 0;
+
+  /* Remove this selection from the list */
+  n = 0;
+  while(qi->selections[n] != sel &&
+       qi->selections[n] != None) n++;
+  if (qi->selections[n] == sel) {
+    while(qi->selections[n] != None) {
+      qi->selections[n] = qi->selections[n + 1];
+      n++;
+    }
+  }
+
+  while(i < qi->count) {
+    QueuedRequest req = qi->requests[i];
+
+    if (req->selection == sel) {
+      /* Match */
+      if (req->param != None)
+       FreeSelectionProperty(dpy, req->param);
+      qi->count--;
+
+      for(j = i; j < qi->count; j++)
+       qi->requests[j] = qi->requests[j + 1];
+
+      XtFree((char*) req);
+    } else {
+      i++;
+    }
+  }
+}
+
+void XtCreateSelectionRequest(
+    Widget widget,
+    Atom selection)
+{
+  QueuedRequestInfo queueInfo;
+  Window window = XtWindow(widget);
+  Display *dpy = XtDisplay(widget);
+  int n;
+
+  LOCK_PROCESS;
+  if (multipleContext == 0) multipleContext = XUniqueContext();
+
+  queueInfo = NULL;
+  (void) XFindContext(dpy, window, multipleContext, (XPointer*) &queueInfo);
+
+  /* If there is one,  then cancel it */
+  if (queueInfo != NULL)
+    CleanupRequest(dpy, queueInfo, selection);
+  else {
+    /* Create it */
+    queueInfo = (QueuedRequestInfo) __XtMalloc(sizeof(QueuedRequestInfoRec));
+    queueInfo->count = 0;
+    queueInfo->selections = (Atom*) __XtMalloc(sizeof(Atom) * 2);
+    queueInfo->selections[0] = None;
+    queueInfo->requests = (QueuedRequest *)
+      __XtMalloc(sizeof(QueuedRequest));
+  }
+
+  /* Append this selection to list */
+  n = 0;
+  while(queueInfo->selections[n] != None) n++;
+  queueInfo->selections =
+    (Atom*) XtRealloc((char*) queueInfo->selections,
+                     (n + 2) * sizeof(Atom));
+  queueInfo->selections[n] = selection;
+  queueInfo->selections[n + 1] = None;
+
+  (void) XSaveContext(dpy, window, multipleContext, (char*) queueInfo);
+  UNLOCK_PROCESS;
+}
+
+void XtSendSelectionRequest(
+    Widget widget,
+    Atom selection,
+    Time time)
+{
+  QueuedRequestInfo queueInfo;
+  Window window = XtWindow(widget);
+  Display *dpy = XtDisplay(widget);
+
+  LOCK_PROCESS;
+  if (multipleContext == 0) multipleContext = XUniqueContext();
+
+  queueInfo = NULL;
+  (void) XFindContext(dpy, window, multipleContext, (XPointer*) &queueInfo);
+  if (queueInfo != NULL) {
+    int count = 0;
+    int i;
+    QueuedRequest *req = queueInfo->requests;
+
+    /* Construct the requests and send it using
+       GetSelectionValues */
+    for(i = 0; i < queueInfo->count; i++)
+      if (req[i]->selection == selection) count++;
+
+    if (count > 0) {
+      if (count == 1) {
+       for(i = 0; i < queueInfo->count; i++)
+         if (req[i]->selection == selection) break;
+
+       /* special case a multiple which isn't needed */
+       GetSelectionValue(widget, selection, req[i]->target,
+                         req[i]->callback, req[i]->closure, time,
+                         req[i]->incremental, req[i]->param);
+      } else {
+       Atom *targets;
+       Atom t[PREALLOCED];
+       XtSelectionCallbackProc *cbs;
+       XtSelectionCallbackProc c[PREALLOCED];
+       XtPointer *closures;
+       XtPointer cs[PREALLOCED];
+       Boolean *incrs;
+       Boolean ins[PREALLOCED];
+       Atom *props;
+       Atom p[PREALLOCED];
+       int i = 0;
+       int j = 0;
+
+       /* Allocate */
+       targets = (Atom *) XtStackAlloc(count * sizeof(Atom), t);
+       cbs = (XtSelectionCallbackProc *)
+         XtStackAlloc(count * sizeof(XtSelectionCallbackProc), c);
+       closures = (XtPointer *) XtStackAlloc(count * sizeof(XtPointer), cs);
+       incrs = (Boolean *) XtStackAlloc(count * sizeof(Boolean), ins);
+       props = (Atom *) XtStackAlloc(count * sizeof(Atom), p);
+
+       /* Copy */
+       for(i = 0; i < queueInfo->count; i++) {
+         if (req[i]->selection == selection) {
+           targets[j] = req[i]->target;
+           cbs[j] = req[i]->callback;
+           closures[j] = req[i]->closure;
+           incrs[j] = req[i]->incremental;
+           props[j] = req[i]->param;
+           j++;
+         }
+       }
+
+       /* Make the request */
+       GetSelectionValues(widget, selection, targets, count,
+                          cbs, count, closures, time, incrs, props);
+
+       /* Free */
+       XtStackFree((XtPointer) targets, t);
+       XtStackFree((XtPointer) cbs, c);
+       XtStackFree((XtPointer) closures, cs);
+       XtStackFree((XtPointer) incrs, ins);
+       XtStackFree((XtPointer) props, p);
+      }
+    }
+  }
+
+  CleanupRequest(dpy, queueInfo, selection);
+  UNLOCK_PROCESS;
+}
+
+void XtCancelSelectionRequest(
+    Widget widget,
+    Atom selection)
+{
+  QueuedRequestInfo queueInfo;
+  Window window = XtWindow(widget);
+  Display *dpy = XtDisplay(widget);
+
+  LOCK_PROCESS;
+  if (multipleContext == 0) multipleContext = XUniqueContext();
+
+  queueInfo = NULL;
+  (void) XFindContext(dpy, window, multipleContext, (XPointer*) &queueInfo);
+  /* If there is one,  then cancel it */
+  if (queueInfo != NULL)
+    CleanupRequest(dpy, queueInfo, selection);
+  UNLOCK_PROCESS;
+}
+
+/* Parameter utilities */
+
+/* Parameters on a selection request */
+/* Places data on allocated parameter atom,  then records the
+   parameter atom data for use in the next call to one of
+   the XtGetSelectionValue functions. */
+void XtSetSelectionParameters(
+    Widget requestor,
+    Atom selection,
+    Atom type,
+    XtPointer value,
+    unsigned long length,
+    int format)
+{
+  Display *dpy = XtDisplay(requestor);
+  Window window = XtWindow(requestor);
+  Atom property = GetParamInfo(requestor, selection);
+
+  if (property == None) {
+    property = GetSelectionProperty(dpy);
+    AddParamInfo(requestor, selection, property);
+  }
+
+  XChangeProperty(dpy, window, property,
+                 type, format, PropModeReplace,
+                 (unsigned char *) value, length);
+}
+
+/* Retrieves data passed in a parameter. Data for this is stored
+   on the originator's window */
+void XtGetSelectionParameters(
+    Widget owner,
+    Atom selection,
+    XtRequestId request_id,
+    Atom* type_return,
+    XtPointer* value_return,
+    unsigned long* length_return,
+    int* format_return)
+{
+    Request req;
+    Display *dpy = XtDisplay(owner);
+    WIDGET_TO_APPCON(owner);
+
+    *value_return = NULL;
+    *length_return = *format_return = 0;
+    *type_return = None;
+
+    LOCK_APP(app);
+
+    req = GetRequestRecord(owner, selection, request_id);
+
+    if (req && req->property) {
+       unsigned long bytes_after;      /* unused */
+       StartProtectedSection(dpy, req->requestor);
+       XGetWindowProperty(dpy, req->requestor, req->property, 0L, 10000000,
+                          False, AnyPropertyType, type_return, format_return,
+                          length_return, &bytes_after,
+                          (unsigned char**) value_return);
+       EndProtectedSection(dpy);
+#ifdef XT_COPY_SELECTION
+       if (*value_return) {
+           int size = BYTELENGTH(*length_return, *format_return) + 1;
+           char *tmp = __XtMalloc((Cardinal) size);
+           (void) memmove(tmp, *value_return, size);
+           XFree(*value_return);
+           *value_return = tmp;
+       }
+#endif
+    }
+    UNLOCK_APP(app);
+}
+
+/*  Parameters are temporarily stashed in an XContext.  A list is used because
+ *  there may be more than one selection request in progress.  The context
+ *  data is deleted when the list is empty.  In the future, the parameter
+ *  context could be merged with other contexts used during selections.
+ */
+
+static void AddParamInfo(
+    Widget w,
+    Atom selection,
+    Atom param_atom)
+{
+    int n;
+    Param p;
+    ParamInfo pinfo;
+
+    LOCK_PROCESS;
+    if (paramPropertyContext == 0)
+       paramPropertyContext = XUniqueContext();
+
+    if (XFindContext(XtDisplay(w), XtWindow(w), paramPropertyContext,
+                    (XPointer *) &pinfo)) {
+       pinfo = (ParamInfo) __XtMalloc(sizeof(ParamInfoRec));
+       pinfo->count = 1;
+       pinfo->paramlist = XtNew(ParamRec);
+       p = pinfo->paramlist;
+       (void) XSaveContext(XtDisplay(w), XtWindow(w), paramPropertyContext,
+                           (char *)pinfo);
+    }
+    else {
+       for (n = pinfo->count, p = pinfo->paramlist; n; n--, p++) {
+           if (p->selection == None || p->selection == selection)
+               break;
+       }
+       if (n == 0) {
+           pinfo->count++;
+           pinfo->paramlist = (Param)
+               XtRealloc((char*) pinfo->paramlist,
+                         pinfo->count * sizeof(ParamRec));
+           p = &pinfo->paramlist[pinfo->count - 1];
+           (void) XSaveContext(XtDisplay(w), XtWindow(w),
+                               paramPropertyContext, (char *)pinfo);
+       }
+    }
+    p->selection = selection;
+    p->param = param_atom;
+    UNLOCK_PROCESS;
+}
+
+static void RemoveParamInfo(
+    Widget w,
+    Atom selection)
+{
+    int n;
+    Param p;
+    ParamInfo pinfo;
+    Boolean retain = False;
+
+    LOCK_PROCESS;
+    if (paramPropertyContext
+       && (XFindContext(XtDisplay(w), XtWindow(w), paramPropertyContext,
+                        (XPointer *) &pinfo) == 0)) {
+
+       /* Find and invalidate the parameter data. */
+       for (n = pinfo->count, p = pinfo->paramlist; n; n--, p++) {
+           if (p->selection != None) {
+               if (p->selection == selection)
+                   p->selection = None;
+               else
+                   retain = True;
+           }
+       }
+       /* If there's no valid data remaining, release the context entry. */
+       if (! retain) {
+           XtFree((char*) pinfo->paramlist);
+           XtFree((char*) pinfo);
+           XDeleteContext(XtDisplay(w), XtWindow(w), paramPropertyContext);
+       }
+    }
+    UNLOCK_PROCESS;
+}
+
+static Atom GetParamInfo(
+    Widget w,
+    Atom selection)
+{
+    int n;
+    Param p;
+    ParamInfo pinfo;
+    Atom atom = None;
+
+    LOCK_PROCESS;
+    if (paramPropertyContext
+       && (XFindContext(XtDisplay(w), XtWindow(w), paramPropertyContext,
+                        (XPointer *) &pinfo) == 0)) {
+
+       for (n = pinfo->count, p = pinfo->paramlist; n; n--, p++)
+           if (p->selection == selection) {
+               atom = p->param;
+               break;
+           }
+    }
+    UNLOCK_PROCESS;
+    return atom;
+}
diff --git a/src/SetSens.c b/src/SetSens.c
new file mode 100644 (file)
index 0000000..85443a5
--- /dev/null
@@ -0,0 +1,136 @@
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+
+/*
+ *     XtSetSensitive()
+ */
+
+static void SetAncestorSensitive(
+    register Widget widget,
+    Boolean        ancestor_sensitive)
+{
+    Arg                        args[1];
+    register Cardinal   i;
+    register WidgetList children;
+
+    if (widget->core.ancestor_sensitive == ancestor_sensitive) return;
+
+    XtSetArg(args[0], XtNancestorSensitive, ancestor_sensitive);
+    XtSetValues(widget, args, XtNumber(args));
+
+    /* If widget's sensitive is TRUE, propagate new ancestor_sensitive to
+       children's ancestor_sensitive; else do nothing as children's
+       ancestor_sensitive is already FALSE */
+
+    if (widget->core.sensitive && XtIsComposite(widget)) {
+       children = ((CompositeWidget) widget)->composite.children;
+       for (i=0; i < ((CompositeWidget)widget)->composite.num_children; i++) {
+           SetAncestorSensitive (children[i], ancestor_sensitive);
+       }
+    }
+} /* SetAncestorSensitive */
+
+
+void XtSetSensitive(
+    register Widget widget,
+    _XtBoolean     sensitive)
+{
+    Arg                        args[1];
+    register Cardinal   i;
+    register WidgetList children;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    if (widget->core.sensitive == sensitive) {
+       UNLOCK_APP(app);
+       return;
+    }
+
+    XtSetArg(args[0], XtNsensitive, sensitive);
+    XtSetValues(widget, args, XtNumber(args));
+
+    /* If widget's ancestor_sensitive is TRUE, propagate new sensitive to
+       children's ancestor_sensitive; else do nothing as children's
+       ancestor_sensitive is already FALSE */
+
+    if (widget->core.ancestor_sensitive && XtIsComposite (widget)) {
+       children = ((CompositeWidget) widget)->composite.children;
+       for (i = 0; i < ((CompositeWidget)widget)->composite.num_children; i++){
+           SetAncestorSensitive (children[i], sensitive);
+       }
+    }
+    UNLOCK_APP(app);
+} /* XtSetSensitive */
diff --git a/src/SetValues.c b/src/SetValues.c
new file mode 100644 (file)
index 0000000..e432ec7
--- /dev/null
@@ -0,0 +1,451 @@
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+
+/*
+ *     XtSetValues(), XtSetSubvalues()
+ */
+
+
+static void SetValues(
+  char*                        base,           /* Base address to write values to   */
+  XrmResourceList*     res,            /* The current resource values.      */
+  register Cardinal    num_resources,  /* number of items in resources      */
+  ArgList              args,           /* The resource values to set        */
+  Cardinal             num_args)       /* number of items in arg list       */
+{
+    register ArgList           arg;
+    register Cardinal          i;
+    register XrmName           argName;
+    register XrmResourceList*   xrmres;
+
+    /* Resource lists are assumed to be in compiled form already via the
+       initial XtGetResources, XtGetSubresources calls */
+
+    for (arg = args ; num_args != 0; num_args--, arg++) {
+       argName = StringToName(arg->name);
+       for (xrmres = res, i = 0; i < num_resources; i++, xrmres++) {
+           if (argName == (*xrmres)->xrm_name) {
+               _XtCopyFromArg(arg->value,
+                   base - (*xrmres)->xrm_offset - 1,
+                   (*xrmres)->xrm_size);
+               break;
+           }
+       }
+    }
+} /* SetValues */
+
+static Boolean CallSetValues (
+    WidgetClass class,
+    Widget      current,
+    Widget      request,
+    Widget      new,
+    ArgList     args,
+    Cardinal    num_args)
+{
+    Boolean redisplay = FALSE;
+    WidgetClass superclass;
+    XtArgsFunc set_values_hook;
+    XtSetValuesFunc set_values;
+
+    LOCK_PROCESS;
+    superclass = class->core_class.superclass;
+    UNLOCK_PROCESS;
+    if (superclass)
+        redisplay =
+           CallSetValues(superclass, current, request, new, args, num_args);
+
+    LOCK_PROCESS;
+    set_values = class->core_class.set_values;
+    UNLOCK_PROCESS;
+    if (set_values)
+        redisplay |= (*set_values) (current, request, new, args, &num_args);
+
+    LOCK_PROCESS;
+    set_values_hook = class->core_class.set_values_hook;
+    UNLOCK_PROCESS;
+    if (set_values_hook)
+       redisplay |= (*set_values_hook) (new, args, &num_args);
+    return (redisplay);
+}
+
+static Boolean
+CallConstraintSetValues (
+    ConstraintWidgetClass class,
+    Widget      current,
+    Widget      request,
+    Widget      new,
+    ArgList     args,
+    Cardinal    num_args)
+{
+    Boolean redisplay = FALSE;
+    XtSetValuesFunc set_values;
+    ConstraintWidgetClass superclass;
+
+    if ((WidgetClass)class != constraintWidgetClass) {
+       if (class == NULL)
+           XtAppErrorMsg(XtWidgetToApplicationContext(current),
+                   "invalidClass","constraintSetValue",XtCXtToolkitError,
+                 "Subclass of Constraint required in CallConstraintSetValues",
+                  (String *)NULL, (Cardinal *)NULL);
+       LOCK_PROCESS;
+       superclass = (ConstraintWidgetClass) class->core_class.superclass;
+       UNLOCK_PROCESS;
+       redisplay =
+          CallConstraintSetValues(superclass,
+                                  current, request, new, args, num_args);
+    }
+    LOCK_PROCESS;
+    set_values = class->constraint_class.set_values;
+    UNLOCK_PROCESS;
+    if (set_values)
+        redisplay |= (*set_values) (current, request, new, args, &num_args);
+    return (redisplay);
+}
+
+void XtSetSubvalues(
+  XtPointer             base,           /* Base address to write values to   */
+  register XtResourceList resources,    /* The current resource values.      */
+  register Cardinal     num_resources,  /* number of items in resources      */
+  ArgList               args,           /* The resource values to set        */
+  Cardinal              num_args)       /* number of items in arg list       */
+{
+      register XrmResourceList*   xrmres;
+      xrmres = _XtCreateIndirectionTable (resources, num_resources);
+      SetValues((char*)base,xrmres,num_resources, args, num_args);
+      XtFree((char *)xrmres);
+}
+
+
+void XtSetValues(
+    register Widget   w,
+            ArgList  args,
+            Cardinal num_args)
+{
+    register Widget oldw, reqw;
+    /* need to use strictest alignment rules possible in next two decls. */
+    double         oldwCache[100], reqwCache[100];
+    double         oldcCache[20], reqcCache[20];
+    Cardinal       widgetSize, constraintSize;
+    Boolean        redisplay, cleared_rect_obj = False;
+    XtGeometryResult result;
+    XtWidgetGeometry geoReq, geoReply;
+    WidgetClass     wc;
+    ConstraintWidgetClass cwc = NULL;
+    Boolean        hasConstraints;
+    XtAlmostProc set_values_almost;
+    XtAppContext app = XtWidgetToApplicationContext(w);
+    Widget hookobj = XtHooksOfDisplay(XtDisplayOfObject(w));
+
+    LOCK_APP(app);
+    wc = XtClass(w);
+    if ((args == NULL) && (num_args != 0)) {
+        XtAppErrorMsg(app,
+               "invalidArgCount","xtSetValues",XtCXtToolkitError,
+                "Argument count > 0 on NULL argument list in XtSetValues",
+                 (String *)NULL, (Cardinal *)NULL);
+    }
+
+    /* Allocate and copy current widget into old widget */
+
+    LOCK_PROCESS;
+    widgetSize = wc->core_class.widget_size;
+    UNLOCK_PROCESS;
+    oldw = (Widget) XtStackAlloc(widgetSize, oldwCache);
+    reqw = (Widget) XtStackAlloc (widgetSize, reqwCache);
+    (void) memmove((char *) oldw, (char *) w, (int) widgetSize);
+
+    /* Set resource values */
+
+    LOCK_PROCESS;
+    SetValues((char*)w, (XrmResourceList *) wc->core_class.resources,
+       wc->core_class.num_resources, args, num_args);
+    UNLOCK_PROCESS;
+
+    (void) memmove ((char *) reqw, (char *) w, (int) widgetSize);
+
+    hasConstraints = (XtParent(w) != NULL && !XtIsShell(w) && XtIsConstraint(XtParent(w)));
+
+    /* Some widget sets apparently do ugly things by freeing the
+     * constraints on some children, thus the extra test here */
+    if (hasConstraints) {
+       cwc = (ConstraintWidgetClass) XtClass(w->core.parent);
+       if (w->core.constraints) {
+           LOCK_PROCESS;
+           constraintSize = cwc->constraint_class.constraint_size;
+           UNLOCK_PROCESS;
+       } else constraintSize = 0;
+    } else constraintSize = 0;
+
+    if (constraintSize) {
+       /* Allocate and copy current constraints into oldw */
+       oldw->core.constraints = XtStackAlloc(constraintSize, oldcCache);
+       reqw->core.constraints = XtStackAlloc(constraintSize, reqcCache);
+       (void) memmove((char *) oldw->core.constraints,
+                      (char *) w->core.constraints, (int) constraintSize);
+
+       /* Set constraint values */
+       LOCK_PROCESS;
+       SetValues((char*)w->core.constraints,
+           (XrmResourceList *)(cwc->constraint_class.resources),
+           cwc->constraint_class.num_resources, args, num_args);
+       UNLOCK_PROCESS;
+       (void) memmove((char *) reqw->core.constraints,
+                      (char *) w->core.constraints, (int) constraintSize);
+    }
+
+    /* Inform widget of changes, then inform parent of changes */
+    redisplay = CallSetValues (wc, oldw, reqw, w, args, num_args);
+    if (hasConstraints) {
+       redisplay |= CallConstraintSetValues(cwc, oldw, reqw, w, args, num_args);
+    }
+
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+       XtChangeHookDataRec call_data;
+       XtChangeHookSetValuesDataRec set_val;
+
+       set_val.old = oldw;
+       set_val.req = reqw;
+       set_val.args = args;
+       set_val.num_args = num_args;
+       call_data.type = XtHsetValues;
+       call_data.widget = w;
+       call_data.event_data = (XtPointer) &set_val;
+       XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.changehook_callbacks,
+               (XtPointer)&call_data);
+    }
+
+    if (XtIsRectObj(w)) {
+       /* Now perform geometry request if needed */
+       geoReq.request_mode = 0;
+       if (oldw->core.x        != w->core.x) {
+           geoReq.x            = w->core.x;
+           w->core.x           = oldw->core.x;
+           geoReq.request_mode |= CWX;
+       }
+       if (oldw->core.y        != w->core.y) {
+           geoReq.y            = w->core.y;
+           w->core.y           = oldw->core.y;
+           geoReq.request_mode |= CWY;
+       }
+       if (oldw->core.width    != w->core.width) {
+           geoReq.width        = w->core.width;
+           w->core.width       = oldw->core.width;
+           geoReq.request_mode |= CWWidth;
+       }
+       if (oldw->core.height   != w->core.height) {
+           geoReq.height       = w->core.height;
+           w->core.height      = oldw->core.height;
+           geoReq.request_mode |= CWHeight;
+       }
+       if (oldw->core.border_width != w->core.border_width) {
+           geoReq.border_width     = w->core.border_width;
+           w->core.border_width    = oldw->core.border_width;
+           geoReq.request_mode     |= CWBorderWidth;
+       }
+
+       if (geoReq.request_mode != 0) {
+           /* Pass on any requests for unchanged geometry values */
+           if (geoReq.request_mode !=
+               (CWX | CWY | CWWidth | CWHeight | CWBorderWidth)) {
+               for ( ; num_args != 0; num_args--, args++) {
+                   if (! (geoReq.request_mode & CWX) &&
+                       strcmp(XtNx, args->name) == 0) {
+                       geoReq.x = w->core.x;
+                       geoReq.request_mode |= CWX;
+                   } else if (! (geoReq.request_mode & CWY) &&
+                              strcmp(XtNy, args->name) == 0) {
+                       geoReq.y = w->core.y;
+                       geoReq.request_mode |= CWY;
+                   } else if (! (geoReq.request_mode & CWWidth) &&
+                              strcmp(XtNwidth, args->name) == 0) {
+                       geoReq.width = w->core.width;
+                       geoReq.request_mode |= CWWidth;
+                   } else if (! (geoReq.request_mode & CWHeight) &&
+                              strcmp(XtNheight, args->name) == 0) {
+                       geoReq.height = w->core.height;
+                       geoReq.request_mode |= CWHeight;
+                   } else if (! (geoReq.request_mode & CWBorderWidth) &&
+                              strcmp(XtNborderWidth, args->name) == 0) {
+                       geoReq.border_width = w->core.border_width;
+                       geoReq.request_mode |= CWBorderWidth;
+                   }
+               }
+           }
+           CALLGEOTAT(_XtGeoTrace(w,
+                    "\nXtSetValues sees some geometry changes for \"%s\".\n",
+                          XtName(w)));
+           CALLGEOTAT(_XtGeoTab(1));
+           do {
+               XtGeometryHookDataRec call_data;
+
+               if (XtHasCallbacks(hookobj, XtNgeometryHook) == XtCallbackHasSome) {
+                   call_data.type = XtHpreGeometry;
+                   call_data.widget = w;
+                   call_data.request = &geoReq;
+                   XtCallCallbackList(hookobj,
+                       ((HookObject)hookobj)->hooks.geometryhook_callbacks,
+                       (XtPointer)&call_data);
+                   call_data.result = result =
+                       _XtMakeGeometryRequest(w, &geoReq, &geoReply,
+                                              &cleared_rect_obj);
+                   call_data.type = XtHpostGeometry;
+                   call_data.reply = &geoReply;
+                   XtCallCallbackList(hookobj,
+                       ((HookObject)hookobj)->hooks.geometryhook_callbacks,
+                       (XtPointer)&call_data);
+               } else {
+                   result = _XtMakeGeometryRequest(w, &geoReq, &geoReply,
+                                                   &cleared_rect_obj);
+               }
+               if (result == XtGeometryYes || result == XtGeometryDone)
+                   break;
+
+               /* An Almost or No reply.  Call widget and let it munge
+                  request, reply */
+               LOCK_PROCESS;
+               set_values_almost = wc->core_class.set_values_almost;
+               UNLOCK_PROCESS;
+               if (set_values_almost == NULL) {
+                   XtAppWarningMsg(app,
+                           "invalidProcedure","set_values_almost",
+                         XtCXtToolkitError,
+                         "set_values_almost procedure shouldn't be NULL",
+                         (String *)NULL, (Cardinal *)NULL);
+                   break;
+               }
+               if (result == XtGeometryNo) geoReply.request_mode = 0;
+               CALLGEOTAT(_XtGeoTrace(w,"calling SetValuesAlmost.\n"));
+               (*set_values_almost) (oldw, w, &geoReq, &geoReply);
+           } while (geoReq.request_mode != 0);
+           /* call resize proc if we changed size and parent
+            * didn't already invoke resize */
+           {
+           XtWidgetProc resize;
+           LOCK_PROCESS;
+           resize = wc->core_class.resize;
+           UNLOCK_PROCESS;
+           if ((w->core.width != oldw->core.width ||
+                w->core.height != oldw->core.height)
+               && result != XtGeometryDone
+               && resize != (XtWidgetProc) NULL) {
+               CALLGEOTAT(_XtGeoTrace(w,
+                                "XtSetValues calls \"%s\"'s resize proc.\n",
+                              XtName(w)));
+               (*resize)(w);
+             }
+           }
+           CALLGEOTAT(_XtGeoTab(-1));
+       }
+       /* Redisplay if needed.  No point in clearing if the window is
+        * about to disappear, as the Expose event will just go straight
+        * to the bit bucket. */
+        if (XtIsWidget(w)) {
+            /* widgets can distinguish between redisplay and resize, since
+             the server will cause an expose on resize */
+            if (redisplay && XtIsRealized(w) && !w->core.being_destroyed) {
+                CALLGEOTAT(_XtGeoTrace(w,
+                                "XtSetValues calls ClearArea on \"%s\".\n",
+                              XtName(w)));
+               XClearArea (XtDisplay(w), XtWindow(w), 0, 0, 0, 0, TRUE);
+           }
+        } else { /*non-window object */
+         if (redisplay && ! cleared_rect_obj ) {
+             Widget pw = _XtWindowedAncestor(w);
+             if (XtIsRealized(pw) && !pw->core.being_destroyed) {
+                 RectObj r = (RectObj)w;
+                 int bw2 = r->rectangle.border_width << 1;
+                 CALLGEOTAT(_XtGeoTrace(w,
+                  "XtSetValues calls ClearArea on \"%s\"'s parent \"%s\".\n",
+                                XtName(w),XtName(pw)));
+                 XClearArea (XtDisplay (pw), XtWindow (pw),
+                             r->rectangle.x, r->rectangle.y,
+                             r->rectangle.width + bw2,
+                             r->rectangle.height + bw2,TRUE);
+             }
+         }
+        }
+    }
+
+
+    /* Free dynamic storage */
+    if (constraintSize) {
+        XtStackFree(oldw->core.constraints, oldcCache);
+        XtStackFree(reqw->core.constraints, reqcCache);
+    }
+    XtStackFree((XtPointer)oldw, oldwCache);
+    XtStackFree((XtPointer)reqw, reqwCache);
+    UNLOCK_APP(app);
+} /* XtSetValues */
diff --git a/src/SetWMCW.c b/src/SetWMCW.c
new file mode 100644 (file)
index 0000000..8a065d7
--- /dev/null
@@ -0,0 +1,169 @@
+/*
+ *
+ * Author:  Chris D. Peterson, MIT X Consortium
+ */
+
+/************************************************************
+
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+********************************************************/
+
+/*
+
+Copyright 1989, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include <X11/Xatom.h>
+
+/*     Function Name: XtSetWMColormapWindows
+ *
+ *     Description: Sets the value of the WM_COLORMAP_WINDOWS
+ *                   property on a widget's window.
+ *
+ *     Arguments:  widget - specifies the widget on whose window the
+ *                        - WM_COLORMAP_WINDOWS property will be stored.
+ *
+ *                  list - Specifies a list of widgets whose windows are to be
+ *                        listed in the WM_COLORMAP_WINDOWS property.
+ *                  count - Specifies the number of widgets in list.
+ *
+ *     Returns: none.
+ */
+
+void
+XtSetWMColormapWindows(
+    Widget widget,
+    Widget *list,
+    Cardinal count)
+{
+    Window *data;
+    Widget *checked, *top, *temp, hookobj;
+    Cardinal i, j, checked_count;
+    Boolean match;
+    Atom xa_wm_colormap_windows;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    if ( !XtIsRealized(widget) || (count == 0) ) {
+       UNLOCK_APP(app);
+       return;
+    }
+
+    top = checked = (Widget *) __XtMalloc( (Cardinal) sizeof(Widget) * count);
+
+
+/*
+ * The specification calls for only adding the windows that have unique
+ * colormaps to the property to this function, so we will make a pass through
+ * the widget list removing all the widgets with non-unique colormaps.
+ *
+ * We will also remove any unrealized widgets from the list at this time.
+ */
+
+    for (checked_count = 0, i = 0; i < count; i++) {
+       if (!XtIsRealized(list[i])) continue;
+
+       *checked = list[i];
+       match = FALSE;
+
+/*
+ * Don't check first element for matching colormap since there is nothing
+ * to check it against.
+ */
+
+       if (checked != top)
+           for (j = 0, temp = top; j < checked_count ; j++, temp++)
+               if ( (*temp)->core.colormap == (*checked)->core.colormap) {
+                   match = TRUE;
+                   break;
+               }
+
+/*
+ * If no colormap was found to match then add this widget to the linked list.
+ */
+
+       if (!match) {
+           checked++;
+           checked_count++;
+       }
+    }
+
+/*
+ * Now that we have the list of widgets we need to convert it to a list of
+ * windows and set the property.
+ */
+
+    data = (Window *) __XtMalloc( (Cardinal) sizeof(Window) * checked_count);
+
+    for ( i = 0 ; i < checked_count ; i++)
+       data[i] = XtWindow(top[i]);
+
+    xa_wm_colormap_windows = XInternAtom(XtDisplay(widget),
+                                        "WM_COLORMAP_WINDOWS", FALSE);
+
+    XChangeProperty(XtDisplay(widget), XtWindow(widget),
+                   xa_wm_colormap_windows, XA_WINDOW, 32,
+                   PropModeReplace, (unsigned char *) data, (int) i);
+
+    hookobj = XtHooksOfDisplay(XtDisplay(widget));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+       XtChangeHookDataRec call_data;
+
+       call_data.type = XtHsetWMColormapWindows;
+       call_data.widget = widget;
+       call_data.event_data = (XtPointer) list;
+       call_data.num_event_data = count;
+       XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.changehook_callbacks,
+               (XtPointer)&call_data);
+    }
+
+    XtFree( (char *) data);
+    XtFree( (char *) top);
+    UNLOCK_APP(app);
+}
diff --git a/src/Shell.c b/src/Shell.c
new file mode 100644 (file)
index 0000000..8a44651
--- /dev/null
@@ -0,0 +1,3425 @@
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifndef DEFAULT_WM_TIMEOUT
+#define DEFAULT_WM_TIMEOUT 5000
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+#include "Shell.h"
+#include "ShellP.h"
+#include "ShellI.h"
+#include "Vendor.h"
+#include "VendorP.h"
+#include <X11/Xatom.h>
+#include <X11/Xlocale.h>
+#include <X11/ICE/ICElib.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifdef EDITRES
+#include <X11/Xmu/Editres.h>
+#endif
+
+/***************************************************************************
+ *
+ * Note: per the Xt spec, the Shell geometry management assumes in
+ * several places that there is only one managed child.  This is
+ * *not* a bug.  Any subclass that assumes otherwise is broken.
+ *
+ ***************************************************************************/
+
+#define BIGSIZE ((Dimension)32767)
+
+/***************************************************************************
+ *
+ * Default values for resource lists
+ *
+ ***************************************************************************/
+
+#ifdef CRAY
+void _XtShellDepth(Widget, int, XrmValue *);
+void _XtShellColormap(Widget, int, XrmValue *);
+void _XtShellAncestorSensitive(Widget, int, XrmValue *);
+void _XtTitleEncoding(Widget, int, XrmValue *);
+#else
+static void _XtShellDepth(Widget, int, XrmValue *);
+static void _XtShellColormap(Widget, int, XrmValue *);
+static void _XtShellAncestorSensitive(Widget, int, XrmValue *);
+static void _XtTitleEncoding(Widget, int, XrmValue *);
+#endif
+
+/***************************************************************************
+ *
+ * Shell class record
+ *
+ ***************************************************************************/
+
+#define Offset(x)      (XtOffsetOf(ShellRec, x))
+static XtResource shellResources[]=
+{
+       {XtNx, XtCPosition, XtRPosition, sizeof(Position),
+           Offset(core.x), XtRImmediate, (XtPointer)BIGSIZE},
+       {XtNy, XtCPosition, XtRPosition, sizeof(Position),
+           Offset(core.y), XtRImmediate, (XtPointer)BIGSIZE},
+       { XtNdepth, XtCDepth, XtRInt, sizeof(int),
+           Offset(core.depth), XtRCallProc, (XtPointer) _XtShellDepth},
+       { XtNcolormap, XtCColormap, XtRColormap, sizeof(Colormap),
+           Offset(core.colormap), XtRCallProc, (XtPointer) _XtShellColormap},
+       { XtNancestorSensitive, XtCSensitive, XtRBoolean, sizeof(Boolean),
+           Offset(core.ancestor_sensitive), XtRCallProc,
+           (XtPointer) _XtShellAncestorSensitive},
+       { XtNallowShellResize, XtCAllowShellResize, XtRBoolean,
+           sizeof(Boolean), Offset(shell.allow_shell_resize),
+           XtRImmediate, (XtPointer)False},
+       { XtNgeometry, XtCGeometry, XtRString, sizeof(String),
+           Offset(shell.geometry), XtRString, (XtPointer)NULL},
+       { XtNcreatePopupChildProc, XtCCreatePopupChildProc, XtRFunction,
+           sizeof(XtCreatePopupChildProc), Offset(shell.create_popup_child_proc),
+           XtRFunction, NULL},
+       { XtNsaveUnder, XtCSaveUnder, XtRBoolean, sizeof(Boolean),
+           Offset(shell.save_under), XtRImmediate, (XtPointer)False},
+       { XtNpopupCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList),
+           Offset(shell.popup_callback), XtRCallback, (XtPointer) NULL},
+       { XtNpopdownCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList),
+           Offset(shell.popdown_callback), XtRCallback, (XtPointer) NULL},
+       { XtNoverrideRedirect, XtCOverrideRedirect,
+           XtRBoolean, sizeof(Boolean), Offset(shell.override_redirect),
+           XtRImmediate, (XtPointer)False},
+       { XtNvisual, XtCVisual, XtRVisual, sizeof(Visual*),
+           Offset(shell.visual), XtRImmediate, (XtPointer)CopyFromParent}
+};
+
+static void ClassPartInitialize(WidgetClass);
+static void Initialize(Widget, Widget, ArgList, Cardinal *);
+static void Realize(Widget, Mask *, XSetWindowAttributes *);
+static void Resize(Widget);
+static Boolean SetValues(Widget, Widget, Widget, ArgList , Cardinal *);
+static void GetValuesHook(Widget, ArgList, Cardinal*);
+static void ChangeManaged(Widget);
+static XtGeometryResult GeometryManager(Widget, XtWidgetGeometry *, XtWidgetGeometry *);
+static XtGeometryResult RootGeometryManager(Widget gw, XtWidgetGeometry *request, XtWidgetGeometry *reply);
+static void Destroy(Widget);
+
+static ShellClassExtensionRec shellClassExtRec = {
+    NULL,
+    NULLQUARK,
+    XtShellExtensionVersion,
+    sizeof(ShellClassExtensionRec),
+    RootGeometryManager
+};
+
+externaldef(shellclassrec) ShellClassRec shellClassRec = {
+  {   /* Core */
+    /* superclass        */    (WidgetClass) &compositeClassRec,
+    /* class_name        */    "Shell",
+    /* size              */    sizeof(ShellRec),
+    /* Class Initializer  */   NULL,
+    /* class_part_initialize*/ ClassPartInitialize,
+    /* Class init'ed ?   */    FALSE,
+    /* initialize        */    Initialize,
+    /* initialize_notify  */   NULL,
+    /* realize           */    Realize,
+    /* actions           */    NULL,
+    /* num_actions       */    0,
+    /* resources         */    shellResources,
+    /* resource_count    */    XtNumber(shellResources),
+    /* xrm_class         */    NULLQUARK,
+    /* compress_motion   */    FALSE,
+    /* compress_exposure  */   TRUE,
+    /* compress_enterleave*/   FALSE,
+    /* visible_interest          */    FALSE,
+    /* destroy           */    Destroy,
+    /* resize            */    Resize,
+    /* expose            */    NULL,
+    /* set_values        */    SetValues,
+    /* set_values_hook   */    NULL,
+    /* set_values_almost  */   XtInheritSetValuesAlmost,
+    /* get_values_hook   */    GetValuesHook,
+    /* accept_focus      */    NULL,
+    /* intrinsics version */   XtVersion,
+    /* callback offsets          */    NULL,
+    /* tm_table                  */    NULL,
+    /* query_geometry    */    NULL,
+    /* display_accelerator*/   NULL,
+    /* extension         */    NULL
+  },{ /* Composite */
+    /* geometry_manager          */    GeometryManager,
+    /* change_managed    */    ChangeManaged,
+    /* insert_child      */    XtInheritInsertChild,
+    /* delete_child      */    XtInheritDeleteChild,
+    /* extension         */    NULL
+  },{ /* Shell */
+    /* extension         */    (XtPointer)&shellClassExtRec
+  }
+};
+
+externaldef(shellwidgetclass) WidgetClass shellWidgetClass = (WidgetClass) (&shellClassRec);
+
+/***************************************************************************
+ *
+ * OverrideShell class record
+ *
+ ***************************************************************************/
+
+static XtResource overrideResources[]=
+{
+       { XtNoverrideRedirect, XtCOverrideRedirect,
+           XtRBoolean, sizeof(Boolean), Offset(shell.override_redirect),
+           XtRImmediate, (XtPointer)True},
+       { XtNsaveUnder, XtCSaveUnder, XtRBoolean, sizeof(Boolean),
+           Offset(shell.save_under), XtRImmediate, (XtPointer)True},
+};
+
+externaldef(overrideshellclassrec) OverrideShellClassRec overrideShellClassRec = {
+  {
+    /* superclass         */    (WidgetClass) &shellClassRec,
+    /* class_name         */    "OverrideShell",
+    /* size               */    sizeof(OverrideShellRec),
+    /* Class Initializer  */   NULL,
+    /* class_part_initialize*/ NULL,
+    /* Class init'ed ?    */   FALSE,
+    /* initialize         */    NULL,
+    /* initialize_notify    */ NULL,
+    /* realize            */    XtInheritRealize,
+    /* actions            */    NULL,
+    /* num_actions        */    0,
+    /* resources          */    overrideResources,
+    /* resource_count     */   XtNumber(overrideResources),
+    /* xrm_class          */    NULLQUARK,
+    /* compress_motion    */    FALSE,
+    /* compress_exposure  */    TRUE,
+    /* compress_enterleave*/   FALSE,
+    /* visible_interest   */    FALSE,
+    /* destroy            */    NULL,
+    /* resize             */    XtInheritResize,
+    /* expose             */    NULL,
+    /* set_values         */    NULL,
+    /* set_values_hook      */ NULL,
+    /* set_values_almost    */ XtInheritSetValuesAlmost,
+    /* get_values_hook      */ NULL,
+    /* accept_focus       */    NULL,
+    /* intrinsics version */   XtVersion,
+    /* callback offsets   */    NULL,
+    /* tm_table                    */  NULL,
+    /* query_geometry      */  NULL,
+    /* display_accelerator  */  NULL,
+    /* extension           */  NULL
+  },{
+    /* geometry_manager   */    XtInheritGeometryManager,
+    /* change_managed     */    XtInheritChangeManaged,
+    /* insert_child      */    XtInheritInsertChild,
+    /* delete_child      */    XtInheritDeleteChild,
+    /* extension           */  NULL
+  },{
+    /* extension           */  NULL
+  },{
+    /* extension           */  NULL
+  }
+};
+
+externaldef(overrideshellwidgetclass) WidgetClass overrideShellWidgetClass =
+       (WidgetClass) (&overrideShellClassRec);
+
+/***************************************************************************
+ *
+ * WMShell class record
+ *
+ ***************************************************************************/
+
+#undef Offset
+#define Offset(x)      (XtOffsetOf(WMShellRec, x))
+
+static int default_unspecified_shell_int = XtUnspecifiedShellInt;
+/*
+ * Warning, casting XtUnspecifiedShellInt (which is -1) to an (XtPointer)
+ * can result is loss of bits on some machines (i.e. crays)
+ */
+
+static XtResource wmResources[]=
+{
+       { XtNtitle, XtCTitle, XtRString, sizeof(String),
+           Offset(wm.title), XtRString, NULL},
+       { XtNtitleEncoding, XtCTitleEncoding, XtRAtom, sizeof(Atom),
+           Offset(wm.title_encoding),
+           XtRCallProc, (XtPointer) _XtTitleEncoding},
+       { XtNwmTimeout, XtCWmTimeout, XtRInt, sizeof(int),
+           Offset(wm.wm_timeout), XtRImmediate,(XtPointer)DEFAULT_WM_TIMEOUT},
+       { XtNwaitForWm, XtCWaitForWm, XtRBoolean, sizeof(Boolean),
+           Offset(wm.wait_for_wm), XtRImmediate, (XtPointer)True},
+       { XtNtransient, XtCTransient, XtRBoolean, sizeof(Boolean),
+           Offset(wm.transient), XtRImmediate, (XtPointer)False},
+/* size_hints minus things stored in core */
+       { XtNbaseWidth, XtCBaseWidth, XtRInt, sizeof(int),
+           Offset(wm.base_width),
+           XtRInt, (XtPointer) &default_unspecified_shell_int},
+       { XtNbaseHeight, XtCBaseHeight, XtRInt, sizeof(int),
+           Offset(wm.base_height),
+           XtRInt, (XtPointer) &default_unspecified_shell_int},
+       { XtNwinGravity, XtCWinGravity, XtRGravity, sizeof(int),
+           Offset(wm.win_gravity),
+           XtRGravity, (XtPointer) &default_unspecified_shell_int},
+       { XtNminWidth, XtCMinWidth, XtRInt, sizeof(int),
+           Offset(wm.size_hints.min_width),
+           XtRInt, (XtPointer) &default_unspecified_shell_int},
+       { XtNminHeight, XtCMinHeight, XtRInt, sizeof(int),
+           Offset(wm.size_hints.min_height),
+           XtRInt, (XtPointer) &default_unspecified_shell_int},
+       { XtNmaxWidth, XtCMaxWidth, XtRInt, sizeof(int),
+           Offset(wm.size_hints.max_width),
+           XtRInt, (XtPointer) &default_unspecified_shell_int},
+       { XtNmaxHeight, XtCMaxHeight, XtRInt, sizeof(int),
+           Offset(wm.size_hints.max_height),
+           XtRInt, (XtPointer) &default_unspecified_shell_int},
+       { XtNwidthInc, XtCWidthInc, XtRInt, sizeof(int),
+           Offset(wm.size_hints.width_inc),
+           XtRInt, (XtPointer) &default_unspecified_shell_int},
+       { XtNheightInc, XtCHeightInc, XtRInt, sizeof(int),
+           Offset(wm.size_hints.height_inc),
+           XtRInt, (XtPointer) &default_unspecified_shell_int},
+       { XtNminAspectX, XtCMinAspectX, XtRInt, sizeof(int),
+           Offset(wm.size_hints.min_aspect.x),
+           XtRInt, (XtPointer) &default_unspecified_shell_int},
+       { XtNminAspectY, XtCMinAspectY, XtRInt, sizeof(int),
+           Offset(wm.size_hints.min_aspect.y),
+           XtRInt, (XtPointer) &default_unspecified_shell_int},
+       { XtNmaxAspectX, XtCMaxAspectX, XtRInt, sizeof(int),
+           Offset(wm.size_hints.max_aspect.x),
+           XtRInt, (XtPointer) &default_unspecified_shell_int},
+       { XtNmaxAspectY, XtCMaxAspectY, XtRInt, sizeof(int),
+           Offset(wm.size_hints.max_aspect.y),
+           XtRInt, (XtPointer) &default_unspecified_shell_int},
+/* wm_hints */
+       { XtNinput, XtCInput, XtRBool, sizeof(Bool),
+           Offset(wm.wm_hints.input), XtRImmediate, (XtPointer)False},
+       { XtNinitialState, XtCInitialState, XtRInitialState, sizeof(int),
+           Offset(wm.wm_hints.initial_state),
+           XtRImmediate, (XtPointer)NormalState},
+       { XtNiconPixmap, XtCIconPixmap, XtRBitmap, sizeof(Pixmap),
+           Offset(wm.wm_hints.icon_pixmap), XtRPixmap, NULL},
+       { XtNiconWindow, XtCIconWindow, XtRWindow, sizeof(Window),
+           Offset(wm.wm_hints.icon_window), XtRWindow,   (XtPointer) NULL},
+       { XtNiconX, XtCIconX, XtRInt, sizeof(int),
+           Offset(wm.wm_hints.icon_x),
+           XtRInt, (XtPointer) &default_unspecified_shell_int},
+       { XtNiconY, XtCIconY, XtRInt, sizeof(int),
+           Offset(wm.wm_hints.icon_y),
+           XtRInt, (XtPointer) &default_unspecified_shell_int},
+       { XtNiconMask, XtCIconMask, XtRBitmap, sizeof(Pixmap),
+           Offset(wm.wm_hints.icon_mask), XtRPixmap, NULL},
+       { XtNwindowGroup, XtCWindowGroup, XtRWindow, sizeof(Window),
+           Offset(wm.wm_hints.window_group),
+           XtRImmediate, (XtPointer)XtUnspecifiedWindow},
+       { XtNclientLeader, XtCClientLeader, XtRWidget, sizeof(Widget),
+           Offset(wm.client_leader), XtRWidget, NULL},
+       { XtNwindowRole, XtCWindowRole, XtRString, sizeof(String),
+           Offset(wm.window_role), XtRString, (XtPointer) NULL},
+       { XtNurgency, XtCUrgency, XtRBoolean, sizeof(Boolean),
+           Offset(wm.urgency), XtRImmediate, (XtPointer) False}
+};
+
+static void WMInitialize(Widget, Widget, ArgList, Cardinal *);
+static Boolean WMSetValues(Widget, Widget, Widget, ArgList, Cardinal *);
+static void WMDestroy(Widget);
+
+externaldef(wmshellclassrec) WMShellClassRec wmShellClassRec = {
+  {
+    /* superclass         */    (WidgetClass) &shellClassRec,
+    /* class_name         */    "WMShell",
+    /* size               */    sizeof(WMShellRec),
+    /* Class Initializer  */   NULL,
+    /* class_part_initialize*/ NULL,
+    /* Class init'ed ?    */   FALSE,
+    /* initialize         */    WMInitialize,
+    /* initialize_notify    */ NULL,
+    /* realize            */    XtInheritRealize,
+    /* actions            */    NULL,
+    /* num_actions        */    0,
+    /* resources          */    wmResources,
+    /* resource_count     */   XtNumber(wmResources),
+    /* xrm_class          */    NULLQUARK,
+    /* compress_motion    */    FALSE,
+    /* compress_exposure  */    TRUE,
+    /* compress_enterleave*/   FALSE,
+    /* visible_interest   */    FALSE,
+    /* destroy            */    WMDestroy,
+    /* resize             */    XtInheritResize,
+    /* expose             */    NULL,
+    /* set_values         */    WMSetValues,
+    /* set_values_hook      */ NULL,
+    /* set_values_almost    */ XtInheritSetValuesAlmost,
+    /* get_values_hook      */ NULL,
+    /* accept_focus       */    NULL,
+    /* intrinsics version */   XtVersion,
+    /* callback offsets   */    NULL,
+    /* tm_table                    */  NULL,
+    /* query_geometry      */  NULL,
+    /* display_accelerator  */  NULL,
+    /* extension           */  NULL
+  },{
+    /* geometry_manager   */    XtInheritGeometryManager,
+    /* change_managed     */    XtInheritChangeManaged,
+    /* insert_child      */    XtInheritInsertChild,
+    /* delete_child      */    XtInheritDeleteChild,
+    /* extension           */  NULL
+  },{
+    /* extension           */  NULL
+  },{
+    /* extension           */  NULL
+  }
+};
+
+externaldef(wmshellwidgetclass) WidgetClass wmShellWidgetClass = (WidgetClass) (&wmShellClassRec);
+
+/***************************************************************************
+ *
+ * TransientShell class record
+ *
+ ***************************************************************************/
+
+#undef Offset
+#define Offset(x)      (XtOffsetOf(TransientShellRec, x))
+
+static XtResource transientResources[]=
+{
+       { XtNtransient, XtCTransient, XtRBoolean, sizeof(Boolean),
+           Offset(wm.transient), XtRImmediate, (XtPointer)True},
+       { XtNtransientFor, XtCTransientFor, XtRWidget, sizeof(Widget),
+           Offset(transient.transient_for), XtRWidget, NULL},
+       { XtNsaveUnder, XtCSaveUnder, XtRBoolean, sizeof(Boolean),
+           Offset(shell.save_under), XtRImmediate, (XtPointer)True},
+};
+
+static void TransientRealize(Widget, Mask *, XSetWindowAttributes *);
+static Boolean TransientSetValues(Widget, Widget, Widget, ArgList, Cardinal *);
+
+externaldef(transientshellclassrec) TransientShellClassRec transientShellClassRec = {
+  {
+    /* superclass        */    (WidgetClass) &vendorShellClassRec,
+    /* class_name        */    "TransientShell",
+    /* size              */    sizeof(TransientShellRec),
+    /* Class Initializer  */   NULL,
+    /* class_part_initialize*/ NULL,
+    /* Class init'ed ?   */    FALSE,
+    /* initialize        */    NULL,
+    /* initialize_notify  */   NULL,
+    /* realize           */    TransientRealize,
+    /* actions           */    NULL,
+    /* num_actions       */    0,
+    /* resources         */    transientResources,
+    /* resource_count    */    XtNumber(transientResources),
+    /* xrm_class         */    NULLQUARK,
+    /* compress_motion   */    FALSE,
+    /* compress_exposure  */   TRUE,
+    /* compress_enterleave*/   FALSE,
+    /* visible_interest          */    FALSE,
+    /* destroy           */    NULL,
+    /* resize            */    XtInheritResize,
+    /* expose            */    NULL,
+    /* set_values        */    TransientSetValues,
+    /* set_values_hook   */    NULL,
+    /* set_values_almost  */   XtInheritSetValuesAlmost,
+    /* get_values_hook   */    NULL,
+    /* accept_focus      */    NULL,
+    /* intrinsics version */   XtVersion,
+    /* callback offsets          */    NULL,
+    /* tm_table                  */    XtInheritTranslations,
+    /* query_geometry    */    NULL,
+    /* display_accelerator*/   NULL,
+    /* extension         */    NULL
+  },{
+    /* geometry_manager          */    XtInheritGeometryManager,
+    /* change_managed    */    XtInheritChangeManaged,
+    /* insert_child      */    XtInheritInsertChild,
+    /* delete_child      */    XtInheritDeleteChild,
+    /* extension         */    NULL
+  },{
+    /* extension         */    NULL
+  },{
+    /* extension         */    NULL
+  },{
+    /* extension         */    NULL
+  },{
+    /* extension         */    NULL
+  }
+};
+
+externaldef(transientshellwidgetclass) WidgetClass transientShellWidgetClass =
+       (WidgetClass) (&transientShellClassRec);
+
+/***************************************************************************
+ *
+ * TopLevelShell class record
+ *
+ ***************************************************************************/
+
+#undef Offset
+#define Offset(x)      (XtOffsetOf(TopLevelShellRec, x))
+
+static XtResource topLevelResources[]=
+{
+       { XtNiconName, XtCIconName, XtRString, sizeof(String),
+           Offset(topLevel.icon_name), XtRString, (XtPointer) NULL},
+       { XtNiconNameEncoding, XtCIconNameEncoding, XtRAtom, sizeof(Atom),
+           Offset(topLevel.icon_name_encoding),
+           XtRCallProc, (XtPointer) _XtTitleEncoding},
+       { XtNiconic, XtCIconic, XtRBoolean, sizeof(Boolean),
+           Offset(topLevel.iconic), XtRImmediate, (XtPointer)False}
+};
+
+static void TopLevelInitialize(Widget, Widget, ArgList, Cardinal *);
+static Boolean TopLevelSetValues(Widget, Widget, Widget, ArgList, Cardinal *);
+static void TopLevelDestroy(Widget);
+
+externaldef(toplevelshellclassrec) TopLevelShellClassRec topLevelShellClassRec = {
+  {
+    /* superclass         */    (WidgetClass) &vendorShellClassRec,
+    /* class_name         */    "TopLevelShell",
+    /* size               */    sizeof(TopLevelShellRec),
+    /* Class Initializer  */   NULL,
+    /* class_part_initialize*/ NULL,
+    /* Class init'ed ?    */   FALSE,
+    /* initialize         */    TopLevelInitialize,
+    /* initialize_notify    */ NULL,
+    /* realize            */    XtInheritRealize,
+    /* actions            */    NULL,
+    /* num_actions        */    0,
+    /* resources          */    topLevelResources,
+    /* resource_count     */   XtNumber(topLevelResources),
+    /* xrm_class          */    NULLQUARK,
+    /* compress_motion    */    FALSE,
+    /* compress_exposure  */    TRUE,
+    /* compress_enterleave*/   FALSE,
+    /* visible_interest   */    FALSE,
+    /* destroy            */    TopLevelDestroy,
+    /* resize             */    XtInheritResize,
+    /* expose             */    NULL,
+    /* set_values         */    TopLevelSetValues,
+    /* set_values_hook      */ NULL,
+    /* set_values_almost    */ XtInheritSetValuesAlmost,
+    /* get_values_hook      */ NULL,
+    /* accept_focus       */    NULL,
+    /* intrinsics version */   XtVersion,
+    /* callback offsets   */    NULL,
+    /* tm_table                    */  XtInheritTranslations,
+    /* query_geometry      */  NULL,
+    /* display_accelerator  */  NULL,
+    /* extension           */  NULL
+  },{
+    /* geometry_manager   */    XtInheritGeometryManager,
+    /* change_managed     */    XtInheritChangeManaged,
+    /* insert_child      */    XtInheritInsertChild,
+    /* delete_child      */    XtInheritDeleteChild,
+    /* extension           */  NULL
+  },{
+    /* extension           */  NULL
+  },{
+    /* extension           */  NULL
+  },{
+    /* extension           */  NULL
+  },{
+    /* extension           */  NULL
+  }
+};
+
+externaldef(toplevelshellwidgetclass) WidgetClass topLevelShellWidgetClass =
+       (WidgetClass) (&topLevelShellClassRec);
+
+/***************************************************************************
+ *
+ * ApplicationShell class record
+ *
+ ***************************************************************************/
+
+#undef Offset
+#define Offset(x)      (XtOffsetOf(ApplicationShellRec, x))
+
+static XtResource applicationResources[]=
+{
+    {XtNargc, XtCArgc, XtRInt, sizeof(int),
+         Offset(application.argc), XtRImmediate, (XtPointer)0},
+    {XtNargv, XtCArgv, XtRStringArray, sizeof(String*),
+         Offset(application.argv), XtRPointer, (XtPointer) NULL}
+};
+#undef Offset
+
+static void ApplicationInitialize(Widget, Widget, ArgList, Cardinal *);
+static void ApplicationDestroy(Widget);
+static Boolean ApplicationSetValues(Widget, Widget, Widget, ArgList, Cardinal *);
+static void ApplicationShellInsertChild(Widget);
+
+static CompositeClassExtensionRec compositeClassExtension = {
+    /* next_extension  */      NULL,
+    /* record_type     */      NULLQUARK,
+    /* version         */      XtCompositeExtensionVersion,
+    /* record_size     */      sizeof(CompositeClassExtensionRec),
+    /* accepts_objects */      TRUE,
+    /* allows_change_managed_set */ FALSE
+};
+
+
+externaldef(applicationshellclassrec) ApplicationShellClassRec applicationShellClassRec = {
+  {
+    /* superclass         */    (WidgetClass) &topLevelShellClassRec,
+    /* class_name         */    "ApplicationShell",
+    /* size               */    sizeof(ApplicationShellRec),
+    /* Class Initializer  */   NULL,
+    /* class_part_initialize*/ NULL,
+    /* Class init'ed ?    */   FALSE,
+    /* initialize         */    ApplicationInitialize,
+    /* initialize_notify  */   NULL,
+    /* realize            */    XtInheritRealize,
+    /* actions            */    NULL,
+    /* num_actions        */    0,
+    /* resources          */    applicationResources,
+    /* resource_count     */   XtNumber(applicationResources),
+    /* xrm_class          */    NULLQUARK,
+    /* compress_motion    */    FALSE,
+    /* compress_exposure  */    TRUE,
+    /* compress_enterleave*/    FALSE,
+    /* visible_interest   */    FALSE,
+    /* destroy            */    ApplicationDestroy,
+    /* resize             */    XtInheritResize,
+    /* expose             */    NULL,
+    /* set_values         */    ApplicationSetValues,
+    /* set_values_hook    */   NULL,
+    /* set_values_almost  */   XtInheritSetValuesAlmost,
+    /* get_values_hook    */   NULL,
+    /* accept_focus       */    NULL,
+    /* intrinsics version */   XtVersion,
+    /* callback offsets   */    NULL,
+    /* tm_table                  */    XtInheritTranslations,
+    /* query_geometry    */    NULL,
+    /* display_accelerator*/   NULL,
+    /* extension         */    NULL
+  },{
+    /* geometry_manager   */    XtInheritGeometryManager,
+    /* change_managed     */    XtInheritChangeManaged,
+    /* insert_child      */    ApplicationShellInsertChild,
+    /* delete_child      */    XtInheritDeleteChild,
+    /* extension         */    (XtPointer)&compositeClassExtension
+  },{
+    /* extension         */    NULL
+  },{
+    /* extension         */    NULL
+  },{
+    /* extension         */    NULL
+  },{
+    /* extension         */    NULL
+  },{
+    /* extension         */    NULL
+  }
+};
+
+externaldef(applicationshellwidgetclass) WidgetClass applicationShellWidgetClass =
+       (WidgetClass) (&applicationShellClassRec);
+
+/***************************************************************************
+ *
+ * SessionShell class record
+ *
+ ***************************************************************************/
+
+#undef Offset
+#define Offset(x)      (XtOffsetOf(SessionShellRec, x))
+
+static XtResource sessionResources[]=
+{
+#ifndef XT_NO_SM
+ {XtNconnection, XtCConnection, XtRSmcConn, sizeof(SmcConn),
+       Offset(session.connection), XtRSmcConn, (XtPointer) NULL},
+#endif
+ {XtNsessionID, XtCSessionID, XtRString, sizeof(String),
+       Offset(session.session_id), XtRString, (XtPointer) NULL},
+ {XtNrestartCommand, XtCRestartCommand, XtRCommandArgArray, sizeof(String*),
+       Offset(session.restart_command), XtRPointer, (XtPointer) NULL},
+ {XtNcloneCommand, XtCCloneCommand, XtRCommandArgArray, sizeof(String*),
+       Offset(session.clone_command), XtRPointer, (XtPointer) NULL},
+ {XtNdiscardCommand, XtCDiscardCommand, XtRCommandArgArray, sizeof(String*),
+       Offset(session.discard_command), XtRPointer, (XtPointer) NULL},
+ {XtNresignCommand, XtCResignCommand, XtRCommandArgArray, sizeof(String*),
+       Offset(session.resign_command), XtRPointer, (XtPointer) NULL},
+ {XtNshutdownCommand, XtCShutdownCommand, XtRCommandArgArray, sizeof(String*),
+       Offset(session.shutdown_command), XtRPointer, (XtPointer) NULL},
+ {XtNenvironment, XtCEnvironment, XtREnvironmentArray, sizeof(String*),
+       Offset(session.environment), XtRPointer, (XtPointer) NULL},
+ {XtNcurrentDirectory, XtCCurrentDirectory, XtRDirectoryString, sizeof(String),
+       Offset(session.current_dir), XtRString, (XtPointer) NULL},
+ {XtNprogramPath, XtCProgramPath, XtRString, sizeof(String),
+      Offset(session.program_path), XtRString, (XtPointer) NULL},
+ {XtNrestartStyle, XtCRestartStyle, XtRRestartStyle, sizeof(unsigned char),
+      Offset(session.restart_style), XtRImmediate,
+      (XtPointer) SmRestartIfRunning},
+ {XtNjoinSession, XtCJoinSession, XtRBoolean, sizeof(Boolean),
+       Offset(session.join_session), XtRImmediate, (XtPointer) True},
+ {XtNsaveCallback, XtCCallback, XtRCallback, sizeof(XtPointer),
+       Offset(session.save_callbacks), XtRCallback, (XtPointer) NULL},
+ {XtNinteractCallback, XtCCallback, XtRCallback, sizeof(XtPointer),
+       Offset(session.interact_callbacks), XtRCallback, (XtPointer)NULL},
+ {XtNcancelCallback, XtCCallback, XtRCallback, sizeof(XtPointer),
+       Offset(session.cancel_callbacks), XtRCallback, (XtPointer) NULL},
+ {XtNsaveCompleteCallback, XtCCallback, XtRCallback, sizeof(XtPointer),
+       Offset(session.save_complete_callbacks), XtRCallback, (XtPointer) NULL},
+ {XtNdieCallback, XtCCallback, XtRCallback, sizeof(XtPointer),
+       Offset(session.die_callbacks), XtRCallback, (XtPointer) NULL},
+ {XtNerrorCallback, XtCCallback, XtRCallback, sizeof(XtPointer),
+       Offset(session.error_callbacks), XtRCallback, (XtPointer) NULL}
+};
+#undef Offset
+
+static void SessionInitialize(Widget, Widget, ArgList, Cardinal *);
+static void SessionDestroy(Widget);
+static Boolean SessionSetValues(Widget, Widget, Widget, ArgList, Cardinal *);
+
+static CompositeClassExtensionRec sessionCompositeClassExtension = {
+    /* next_extension  */      NULL,
+    /* record_type     */      NULLQUARK,
+    /* version         */      XtCompositeExtensionVersion,
+    /* record_size     */      sizeof(CompositeClassExtensionRec),
+    /* accepts_objects */      TRUE,
+    /* allows_change_managed_set */ FALSE
+};
+
+
+externaldef(sessionshellclassrec) SessionShellClassRec sessionShellClassRec = {
+  {
+    /* superclass         */    (WidgetClass) &applicationShellClassRec,
+    /* class_name         */    "SessionShell",
+    /* size               */    sizeof(SessionShellRec),
+    /* Class Initializer  */   NULL,
+    /* class_part_initialize*/ NULL,
+    /* Class init'ed ?    */   FALSE,
+    /* initialize         */    SessionInitialize,
+    /* initialize_notify  */   NULL,
+    /* realize            */    XtInheritRealize,
+    /* actions            */    NULL,
+    /* num_actions        */    0,
+    /* resources          */    sessionResources,
+    /* resource_count     */   XtNumber(sessionResources),
+    /* xrm_class          */    NULLQUARK,
+    /* compress_motion    */    FALSE,
+    /* compress_exposure  */    TRUE,
+    /* compress_enterleave*/    FALSE,
+    /* visible_interest   */    FALSE,
+    /* destroy            */    SessionDestroy,
+    /* resize             */    XtInheritResize,
+    /* expose             */    NULL,
+    /* set_values         */    SessionSetValues,
+    /* set_values_hook    */   NULL,
+    /* set_values_almost  */   XtInheritSetValuesAlmost,
+    /* get_values_hook    */   NULL,
+    /* accept_focus       */    NULL,
+    /* intrinsics version */   XtVersion,
+    /* callback offsets   */    NULL,
+    /* tm_table                  */    XtInheritTranslations,
+    /* query_geometry    */    NULL,
+    /* display_accelerator*/   NULL,
+    /* extension         */    NULL
+  },{
+    /* geometry_manager   */    XtInheritGeometryManager,
+    /* change_managed     */    XtInheritChangeManaged,
+    /* insert_child      */    XtInheritInsertChild,
+    /* delete_child      */    XtInheritDeleteChild,
+    /* extension         */    (XtPointer)&sessionCompositeClassExtension
+  },{
+    /* extension         */    NULL
+  },{
+    /* extension         */    NULL
+  },{
+    /* extension         */    NULL
+  },{
+    /* extension         */    NULL
+  },{
+    /* extension         */    NULL
+  },{
+    /* extension          */    NULL
+  }
+};
+
+externaldef(sessionshellwidgetclass) WidgetClass sessionShellWidgetClass =
+       (WidgetClass) (&sessionShellClassRec);
+
+/****************************************************************************
+ * Whew!
+ ****************************************************************************/
+
+static void ComputeWMSizeHints(
+    WMShellWidget w,
+    XSizeHints *hints)
+{
+    register long flags;
+    hints->flags = flags = w->wm.size_hints.flags;
+#define copy(field) hints->field = w->wm.size_hints.field
+    if (flags & (USPosition | PPosition)) {
+       copy(x);
+       copy(y);
+    }
+    if (flags & (USSize | PSize)) {
+       copy(width);
+       copy(height);
+    }
+    if (flags & PMinSize) {
+       copy(min_width);
+       copy(min_height);
+    }
+    if (flags & PMaxSize) {
+       copy(max_width);
+       copy(max_height);
+    }
+    if (flags & PResizeInc) {
+       copy(width_inc);
+       copy(height_inc);
+    }
+    if (flags & PAspect) {
+       copy(min_aspect.x);
+       copy(min_aspect.y);
+       copy(max_aspect.x);
+       copy(max_aspect.y);
+    }
+#undef copy
+#define copy(field) hints->field = w->wm.field
+    if (flags & PBaseSize) {
+       copy(base_width);
+       copy(base_height);
+    }
+    if (flags & PWinGravity)
+       copy(win_gravity);
+#undef copy
+}
+
+static void _SetWMSizeHints(
+    WMShellWidget w)
+{
+    XSizeHints *size_hints = XAllocSizeHints();
+
+    if (size_hints == NULL) _XtAllocError("XAllocSizeHints");
+    ComputeWMSizeHints(w, size_hints);
+    XSetWMNormalHints(XtDisplay((Widget)w), XtWindow((Widget)w), size_hints);
+    XFree((char*)size_hints);
+}
+
+static ShellClassExtension _FindClassExtension(
+    WidgetClass widget_class)
+{
+    ShellClassExtension ext;
+    for (ext = (ShellClassExtension)((ShellWidgetClass)widget_class)
+              ->shell_class.extension;
+        ext != NULL && ext->record_type != NULLQUARK;
+        ext = (ShellClassExtension)ext->next_extension);
+
+    if (ext != NULL) {
+       if (  ext->version == XtShellExtensionVersion
+             && ext->record_size == sizeof(ShellClassExtensionRec)) {
+           /* continue */
+       } else {
+           String params[1];
+           Cardinal num_params = 1;
+           params[0] = widget_class->core_class.class_name;
+           XtErrorMsg( "invalidExtension", "shellClassPartInitialize",
+                       XtCXtToolkitError,
+                "widget class %s has invalid ShellClassExtension record",
+                params, &num_params);
+       }
+    }
+    return ext;
+}
+
+static void ClassPartInitialize(WidgetClass widget_class)
+{
+    ShellClassExtension ext = _FindClassExtension(widget_class);
+    if (ext != NULL) {
+       if (ext->root_geometry_manager == XtInheritRootGeometryManager) {
+           ext->root_geometry_manager =
+               _FindClassExtension(widget_class->core_class.superclass)
+                   ->root_geometry_manager;
+       }
+    } else {
+       /* if not found, spec requires XtInheritRootGeometryManager */
+       XtPointer *extP
+           = &((ShellWidgetClass)widget_class)->shell_class.extension;
+       ext = XtNew(ShellClassExtensionRec);
+       (void) memmove((char*)ext,
+                      (char*)_FindClassExtension(widget_class->core_class.superclass),
+                      sizeof(ShellClassExtensionRec));
+       ext->next_extension = *extP;
+       *extP = (XtPointer)ext;
+    }
+}
+
+
+static void EventHandler(Widget wid, XtPointer closure, XEvent *event, Boolean *continue_to_dispatch);
+static void _popup_set_prop(ShellWidget);
+
+
+/*ARGSUSED*/
+static void XtCopyDefaultDepth(
+    Widget      widget,
+    int                offset,
+    XrmValue    *value)
+{
+    value->addr = (XPointer)(&DefaultDepthOfScreen(XtScreenOfObject(widget)));
+}
+
+#ifndef CRAY
+static
+#endif
+void _XtShellDepth(
+    Widget widget,
+    int closure,
+    XrmValue *value)
+{
+   if (widget->core.parent == NULL) XtCopyDefaultDepth(widget,closure,value);
+   else _XtCopyFromParent (widget,closure,value);
+}
+
+/*ARGSUSED*/
+static void XtCopyDefaultColormap(
+    Widget      widget,
+    int                offset,
+    XrmValue    *value)
+{
+    value->addr = (XPointer)(&DefaultColormapOfScreen(XtScreenOfObject(widget)));
+}
+
+#ifndef CRAY
+static
+#endif
+void _XtShellColormap(
+    Widget widget,
+    int closure,
+    XrmValue *value)
+{
+   if (widget->core.parent == NULL)
+          XtCopyDefaultColormap(widget,closure,value);
+   else _XtCopyFromParent (widget,closure,value);
+}
+
+#ifndef CRAY
+static
+#endif
+void _XtShellAncestorSensitive(
+    Widget widget,
+    int closure,
+    XrmValue *value)
+{
+   static Boolean true = True;
+   if (widget->core.parent == NULL) value->addr = (XPointer)(&true);
+   else _XtCopyFromParent (widget,closure,value);
+}
+
+/*ARGSUSED*/
+#ifndef CRAY
+static
+#endif
+void _XtTitleEncoding(
+    Widget widget,
+    int offset,
+    XrmValue *value)
+{
+    static Atom atom;
+    if (XtWidgetToApplicationContext(widget)->langProcRec.proc) atom = None;
+    else atom = XA_STRING;
+    value->addr = (XPointer) &atom;
+}
+
+
+/* ARGSUSED */
+static void Initialize(
+       Widget req,
+       Widget new,
+       ArgList args,           /* unused */
+       Cardinal *num_args)     /* unused */
+{
+       ShellWidget w = (ShellWidget) new;
+
+       w->shell.popped_up = FALSE;
+       w->shell.client_specified =
+           _XtShellNotReparented | _XtShellPositionValid;
+
+       if (w->core.x == BIGSIZE) {
+           w->core.x = 0;
+           if (w->core.y == BIGSIZE) w->core.y = 0;
+       } else {
+           if (w->core.y == BIGSIZE) w->core.y = 0;
+           else w->shell.client_specified |= _XtShellPPositionOK;
+       }
+
+       XtAddEventHandler(new, (EventMask) StructureNotifyMask,
+               TRUE, EventHandler, (XtPointer) NULL);
+
+#ifdef EDITRES
+       XtAddEventHandler(new, (EventMask) 0, TRUE,
+                         _XEditResCheckMessages, NULL);
+#endif
+}
+
+/* ARGSUSED */
+static void WMInitialize(
+       Widget req, Widget new,
+       ArgList args,           /* unused */
+       Cardinal *num_args)     /* unused */
+{
+       WMShellWidget w = (WMShellWidget) new;
+       TopLevelShellWidget tls = (TopLevelShellWidget) new;    /* maybe */
+
+       if(w->wm.title == NULL) {
+           if (XtIsTopLevelShell(new) &&
+                   tls->topLevel.icon_name != NULL &&
+                   strlen(tls->topLevel.icon_name) != 0) {
+               w->wm.title = XtNewString(tls->topLevel.icon_name);
+           } else {
+               w->wm.title = XtNewString(w->core.name);
+           }
+       } else {
+           w->wm.title = XtNewString(w->wm.title);
+       }
+       w->wm.size_hints.flags = 0;
+       w->wm.wm_hints.flags = 0;
+       if (w->wm.window_role)
+           w->wm.window_role = XtNewString(w->wm.window_role);
+}
+
+
+/* ARGSUSED */
+static void TopLevelInitialize(
+       Widget req, Widget new,
+       ArgList args,           /* unused */
+       Cardinal *num_args)     /* unused */
+{
+       TopLevelShellWidget w = (TopLevelShellWidget) new;
+
+       if (w->topLevel.icon_name == NULL) {
+           w->topLevel.icon_name = XtNewString(w->core.name);
+       } else {
+           w->topLevel.icon_name = XtNewString(w->topLevel.icon_name);
+       }
+
+       if (w->topLevel.iconic)
+           w->wm.wm_hints.initial_state = IconicState;
+}
+
+static String *NewArgv(int, String *);
+static String *NewStringArray(String *);
+static void FreeStringArray(String *);
+
+/* ARGSUSED */
+static void ApplicationInitialize(
+    Widget req, Widget new,
+    ArgList args,              /* unused */
+    Cardinal *num_args)                /* unused */
+{
+    ApplicationShellWidget w = (ApplicationShellWidget)new;
+
+    if (w->application.argc > 0)
+       w->application.argv = NewArgv(w->application.argc,
+                                     w->application.argv);
+}
+
+#define XtSaveInactive 0
+#define XtSaveActive   1
+#define XtInteractPending    2
+#define XtInteractActive     3
+
+#define XtCloneCommandMask     (1L<<0)
+#define XtCurrentDirectoryMask (1L<<1)
+#define XtDiscardCommandMask   (1L<<2)
+#define XtEnvironmentMask      (1L<<3)
+#define XtProgramMask          (1L<<4)
+#define XtResignCommandMask    (1L<<5)
+#define XtRestartCommandMask   (1L<<6)
+#define XtRestartStyleHintMask (1L<<7)
+#define XtShutdownCommandMask  (1L<<8)
+
+static void JoinSession(SessionShellWidget);
+static void SetSessionProperties(SessionShellWidget, Boolean, unsigned long, unsigned long);
+static void StopManagingSession(SessionShellWidget, SmcConn);
+
+typedef struct _XtSaveYourselfRec {
+    XtSaveYourself next;
+    int            save_type;
+    int            interact_style;
+    Boolean        shutdown;
+    Boolean        fast;
+    Boolean        cancel_shutdown;
+    int                   phase;
+    int            interact_dialog_type;
+    Boolean       request_cancel;
+    Boolean       request_next_phase;
+    Boolean        save_success;
+    int            save_tokens;
+    int            interact_tokens;
+} XtSaveYourselfRec;
+
+/* ARGSUSED */
+static void SessionInitialize(
+    Widget req, Widget new,
+    ArgList args,              /* unused */
+    Cardinal *num_args)                /* unused */
+{
+#ifndef XT_NO_SM
+    SessionShellWidget w = (SessionShellWidget)new;
+
+    if (w->session.session_id) w->session.session_id =
+       XtNewString(w->session.session_id);
+    if (w->session.restart_command) w->session.restart_command =
+       NewStringArray(w->session.restart_command);
+    if (w->session.clone_command) w->session.clone_command =
+       NewStringArray(w->session.clone_command);
+    if (w->session.discard_command) w->session.discard_command =
+       NewStringArray(w->session.discard_command);
+    if (w->session.resign_command) w->session.resign_command =
+       NewStringArray(w->session.resign_command);
+    if (w->session.shutdown_command) w->session.shutdown_command =
+       NewStringArray(w->session.shutdown_command);
+    if (w->session.environment) w->session.environment =
+       NewStringArray(w->session.environment);
+    if (w->session.current_dir) w->session.current_dir =
+       XtNewString(w->session.current_dir);
+    if (w->session.program_path) w->session.program_path =
+       XtNewString(w->session.program_path);
+
+    w->session.checkpoint_state = XtSaveInactive;
+    w->session.input_id = 0;
+    w->session.save = NULL;
+
+    if ((w->session.join_session) &&
+       (w->application.argv || w->session.restart_command))
+       JoinSession(w);
+
+    if (w->session.connection)
+       SetSessionProperties(w, True, 0L, 0L);
+#endif /* !XT_NO_SM */
+}
+
+static void Resize(
+    Widget w)
+{
+    register ShellWidget sw = (ShellWidget)w;
+    Widget childwid;
+    Cardinal i;
+    for(i = 0; i < sw->composite.num_children; i++) {
+        if (XtIsManaged(sw->composite.children[i])) {
+             childwid = sw->composite.children[i];
+             XtResizeWidget(childwid, sw->core.width, sw->core.height,
+                           childwid->core.border_width);
+            break;             /* can only be one managed child */
+        }
+    }
+}
+
+static void GetGeometry(Widget, Widget);
+
+static void Realize(
+       Widget wid,
+       Mask *vmask,
+       XSetWindowAttributes *attr)
+{
+       ShellWidget w = (ShellWidget) wid;
+        Mask mask = *vmask;
+
+       if (! (w->shell.client_specified & _XtShellGeometryParsed)) {
+           /* we'll get here only if there was no child the first
+              time we were realized.  If the shell was Unrealized
+              and then re-Realized, we probably don't want to
+              re-evaluate the defaults anyway.
+            */
+           GetGeometry(wid, (Widget)NULL);
+       }
+       else if (w->core.background_pixmap == XtUnspecifiedPixmap) {
+           /* I attempt to inherit my child's background to avoid screen flash
+            * if there is latency between when I get resized and when my child
+            * is resized.  Background=None is not satisfactory, as I want the
+            * user to get immediate feedback on the new dimensions (most
+            * particularly in the case of a non-reparenting wm).  It is
+            * especially important to have the server clear any old cruft
+            * from the display when I am resized larger.
+            */
+           register Widget *childP = w->composite.children;
+           int i;
+           for (i = w->composite.num_children; i; i--, childP++) {
+               if (XtIsWidget(*childP) && XtIsManaged(*childP)) {
+                   if ((*childP)->core.background_pixmap
+                           != XtUnspecifiedPixmap) {
+                       mask &= ~(CWBackPixel);
+                       mask |= CWBackPixmap;
+                       attr->background_pixmap =
+                           w->core.background_pixmap =
+                               (*childP)->core.background_pixmap;
+                   } else {
+                       attr->background_pixel =
+                           w->core.background_pixel =
+                               (*childP)->core.background_pixel;
+                   }
+                   break;
+               }
+           }
+       }
+
+       if(w->shell.save_under) {
+               mask |= CWSaveUnder;
+               attr->save_under = TRUE;
+       }
+       if(w->shell.override_redirect) {
+               mask |= CWOverrideRedirect;
+               attr->override_redirect = TRUE;
+       }
+       if (wid->core.width == 0 || wid->core.height == 0) {
+           Cardinal count = 1;
+           XtErrorMsg("invalidDimension", "shellRealize", XtCXtToolkitError,
+                      "Shell widget %s has zero width and/or height",
+                      &wid->core.name, &count);
+       }
+       wid->core.window = XCreateWindow(XtDisplay(wid),
+               wid->core.screen->root, (int)wid->core.x, (int)wid->core.y,
+               (unsigned int)wid->core.width, (unsigned int)wid->core.height,
+               (unsigned int)wid->core.border_width, (int) wid->core.depth,
+               (unsigned int) InputOutput, w->shell.visual,
+               mask, attr);
+
+       _popup_set_prop(w);
+}
+
+
+static void _SetTransientForHint(
+     TransientShellWidget w,
+     Boolean delete)
+{
+    Window window_group;
+
+    if (w->wm.transient) {
+       if (w->transient.transient_for != NULL
+           && XtIsRealized(w->transient.transient_for))
+           window_group = XtWindow(w->transient.transient_for);
+       else if ((window_group = w->wm.wm_hints.window_group)
+                == XtUnspecifiedWindowGroup) {
+           if (delete)
+               XDeleteProperty( XtDisplay((Widget)w),
+                                XtWindow((Widget)w),
+                                XA_WM_TRANSIENT_FOR
+                               );
+           return;
+       }
+
+       XSetTransientForHint( XtDisplay((Widget)w),
+                             XtWindow((Widget)w),
+                             window_group
+                            );
+    }
+}
+
+
+static void TransientRealize(
+     Widget w,
+     Mask *vmask,
+     XSetWindowAttributes *attr)
+{
+    XtRealizeProc realize;
+
+    LOCK_PROCESS;
+    realize =
+       transientShellWidgetClass->core_class.superclass->core_class.realize;
+    UNLOCK_PROCESS;
+    (*realize) (w, vmask, attr);
+
+    _SetTransientForHint((TransientShellWidget)w, False);
+}
+
+static Widget GetClientLeader(
+    Widget w)
+{
+    while ((! XtIsWMShell(w) || ! ((WMShellWidget)w)->wm.client_leader)
+          && w->core.parent)
+       w = w->core.parent;
+
+    /* ASSERT: w is a WMshell with client_leader set, or w has no parent */
+
+    if (XtIsWMShell(w) && ((WMShellWidget)w)->wm.client_leader)
+       w = ((WMShellWidget)w)->wm.client_leader;
+    return w;
+}
+
+static void EvaluateWMHints(
+    WMShellWidget w)
+{
+       XWMHints *hintp = &w->wm.wm_hints;
+
+       hintp->flags = StateHint | InputHint;
+
+       if (hintp->icon_x == XtUnspecifiedShellInt)
+           hintp->icon_x = -1;
+       else
+           hintp->flags |= IconPositionHint;
+
+       if (hintp->icon_y == XtUnspecifiedShellInt)
+           hintp->icon_y = -1;
+       else
+           hintp->flags |= IconPositionHint;
+
+       if (hintp->icon_pixmap != None) hintp->flags |= IconPixmapHint;
+       if (hintp->icon_mask != None)   hintp->flags |= IconMaskHint;
+       if (hintp->icon_window != None) hintp->flags |= IconWindowHint;
+
+       if (hintp->window_group == XtUnspecifiedWindow) {
+           if(w->core.parent) {
+               Widget p;
+               for (p = w->core.parent; p->core.parent; p = p->core.parent);
+               if (XtIsRealized(p)) {
+                   hintp->window_group = XtWindow(p);
+                   hintp->flags |=  WindowGroupHint;
+               }
+           }
+       } else if (hintp->window_group != XtUnspecifiedWindowGroup)
+           hintp->flags |=  WindowGroupHint;
+
+       if (w->wm.urgency) hintp->flags |= XUrgencyHint;
+}
+
+
+static void EvaluateSizeHints(
+    WMShellWidget w)
+{
+       struct _OldXSizeHints *sizep = &w->wm.size_hints;
+
+       sizep->x = w->core.x;
+       sizep->y = w->core.y;
+       sizep->width = w->core.width;
+       sizep->height = w->core.height;
+
+       if (sizep->flags & USSize) {
+           if (sizep->flags & PSize) sizep->flags &= ~PSize;
+       } else
+           sizep->flags |= PSize;
+
+       if (sizep->flags & USPosition) {
+           if (sizep->flags & PPosition) sizep->flags &= ~PPosition;
+       } else if (w->shell.client_specified & _XtShellPPositionOK)
+           sizep->flags |= PPosition;
+
+       if (sizep->min_aspect.x != XtUnspecifiedShellInt
+           || sizep->min_aspect.y != XtUnspecifiedShellInt
+           || sizep->max_aspect.x != XtUnspecifiedShellInt
+           || sizep->max_aspect.y != XtUnspecifiedShellInt) {
+           sizep->flags |= PAspect;
+       }
+       if (sizep->flags & PBaseSize
+           || w->wm.base_width != XtUnspecifiedShellInt
+           || w->wm.base_height != XtUnspecifiedShellInt) {
+           sizep->flags |= PBaseSize;
+           if (w->wm.base_width == XtUnspecifiedShellInt)
+               w->wm.base_width = 0;
+           if (w->wm.base_height == XtUnspecifiedShellInt)
+               w->wm.base_height = 0;
+       }
+       if (sizep->flags & PResizeInc
+           || sizep->width_inc != XtUnspecifiedShellInt
+           || sizep->height_inc != XtUnspecifiedShellInt) {
+           if (sizep->width_inc < 1) sizep->width_inc = 1;
+           if (sizep->height_inc < 1) sizep->height_inc = 1;
+           sizep->flags |= PResizeInc;
+       }
+       if (sizep->flags & PMaxSize
+           || sizep->max_width != XtUnspecifiedShellInt
+           || sizep->max_height != XtUnspecifiedShellInt) {
+           sizep->flags |= PMaxSize;
+           if (sizep->max_width == XtUnspecifiedShellInt)
+               sizep->max_width = BIGSIZE;
+           if (sizep->max_height == XtUnspecifiedShellInt)
+               sizep->max_height = BIGSIZE;
+       }
+       if (sizep->flags & PMinSize
+           || sizep->min_width != XtUnspecifiedShellInt
+           || sizep->min_height != XtUnspecifiedShellInt) {
+           sizep->flags |= PMinSize;
+           if (sizep->min_width == XtUnspecifiedShellInt)
+               sizep->min_width = 1;
+           if (sizep->min_height == XtUnspecifiedShellInt)
+               sizep->min_height = 1;
+       }
+}
+
+static void _popup_set_prop(
+       ShellWidget w)
+{
+       Widget p;
+       WMShellWidget wmshell = (WMShellWidget) w;
+       TopLevelShellWidget tlshell = (TopLevelShellWidget) w;
+       ApplicationShellWidget appshell = (ApplicationShellWidget) w;
+       XTextProperty icon_name;
+       XTextProperty window_name;
+       char **argv;
+       int argc;
+       XSizeHints *size_hints;
+       Window window_group;
+       XClassHint classhint;
+       Boolean copied_iname, copied_wname;
+
+       if (!XtIsWMShell((Widget)w) || w->shell.override_redirect) return;
+
+       if ((size_hints = XAllocSizeHints()) == NULL)
+           _XtAllocError("XAllocSizeHints");
+
+       copied_iname = copied_wname = False;
+        if (wmshell->wm.title_encoding == None &&
+           XmbTextListToTextProperty(XtDisplay((Widget)w),
+                                     (char**)&wmshell->wm.title,
+                                     1, XStdICCTextStyle,
+                                     &window_name) >= Success) {
+           copied_wname = True;
+       } else {
+           window_name.value = (unsigned char*)wmshell->wm.title;
+           window_name.encoding = wmshell->wm.title_encoding ?
+               wmshell->wm.title_encoding : XA_STRING;
+           window_name.format = 8;
+           window_name.nitems = strlen((char *)window_name.value);
+       }
+
+       if (XtIsTopLevelShell((Widget)w)) {
+            if (tlshell->topLevel.icon_name_encoding == None &&
+               XmbTextListToTextProperty(XtDisplay((Widget)w),
+                                         (char**)&tlshell->topLevel.icon_name,
+                                         1, XStdICCTextStyle,
+                                         &icon_name) >= Success) {
+               copied_iname = True;
+           } else {
+               icon_name.value = (unsigned char*)tlshell->topLevel.icon_name;
+               icon_name.encoding = tlshell->topLevel.icon_name_encoding ?
+                   tlshell->topLevel.icon_name_encoding : XA_STRING;
+               icon_name.format = 8;
+               icon_name.nitems = strlen((char *)icon_name.value);
+           }
+       }
+
+       EvaluateWMHints(wmshell);
+       EvaluateSizeHints(wmshell);
+       ComputeWMSizeHints(wmshell, size_hints);
+
+       if (wmshell->wm.transient
+           && !XtIsTransientShell((Widget)w)
+           && (window_group = wmshell->wm.wm_hints.window_group)
+              != XtUnspecifiedWindowGroup) {
+
+           XSetTransientForHint(XtDisplay((Widget)w),
+                                XtWindow((Widget)w),
+                                window_group
+                                );
+       }
+
+       classhint.res_name = w->core.name;
+       /* For the class, look up to the top of the tree */
+       for (p = (Widget)w; p->core.parent != NULL; p = p->core.parent);
+       if (XtIsApplicationShell(p)) {
+           classhint.res_class =
+               ((ApplicationShellWidget)p)->application.class;
+       } else {
+           LOCK_PROCESS;
+           classhint.res_class = XtClass(p)->core_class.class_name;
+           UNLOCK_PROCESS;
+       }
+
+       if (XtIsApplicationShell((Widget)w)
+           && (argc = appshell->application.argc) != -1)
+           argv = (char**)appshell->application.argv;
+       else {
+           argv = NULL;
+           argc = 0;
+       }
+
+       XSetWMProperties(XtDisplay((Widget)w), XtWindow((Widget)w),
+                        &window_name,
+                        (XtIsTopLevelShell((Widget)w)) ? &icon_name : NULL,
+                        argv, argc,
+                        size_hints,
+                        &wmshell->wm.wm_hints,
+                        &classhint);
+       XFree((char*)size_hints);
+       if (copied_wname)
+           XFree((XPointer)window_name.value);
+       if (copied_iname)
+           XFree((XPointer)icon_name.value);
+
+       LOCK_PROCESS;
+       if (XtWidgetToApplicationContext((Widget)w)->langProcRec.proc) {
+           char *locale = setlocale(LC_CTYPE, (char *)NULL);
+           if (locale)
+               XChangeProperty(XtDisplay((Widget)w), XtWindow((Widget)w),
+                               XInternAtom(XtDisplay((Widget)w),
+                                           "WM_LOCALE_NAME", False),
+                               XA_STRING, 8, PropModeReplace,
+                               (unsigned char *)locale, strlen(locale));
+       }
+       UNLOCK_PROCESS;
+
+       p = GetClientLeader((Widget)w);
+       if (XtWindow(p))
+           XChangeProperty(XtDisplay((Widget)w), XtWindow((Widget)w),
+                           XInternAtom(XtDisplay((Widget)w),
+                                       "WM_CLIENT_LEADER", False),
+                           XA_WINDOW, 32, PropModeReplace,
+                           (unsigned char *)(&(p->core.window)), 1);
+#ifndef XT_NO_SM
+       if (p == (Widget) w) {
+           for ( ; p->core.parent != NULL; p = p->core.parent);
+           if (XtIsSubclass(p, sessionShellWidgetClass)) {
+               String sm_client_id =
+                   ((SessionShellWidget)p)->session.session_id;
+               if (sm_client_id != NULL) {
+                   XChangeProperty(XtDisplay((Widget)w), XtWindow((Widget)w),
+                                   XInternAtom(XtDisplay((Widget)w),
+                                               "SM_CLIENT_ID", False),
+                                   XA_STRING, 8, PropModeReplace,
+                                   (unsigned char *) sm_client_id,
+                                   strlen(sm_client_id));
+               }
+           }
+       }
+#endif /* !XT_NO_SM */
+
+       if (wmshell->wm.window_role)
+           XChangeProperty(XtDisplay((Widget)w), XtWindow((Widget)w),
+                           XInternAtom(XtDisplay((Widget)w),
+                                       "WM_WINDOW_ROLE", False),
+                           XA_STRING, 8, PropModeReplace,
+                           (unsigned char *)wmshell->wm.window_role,
+                           strlen(wmshell->wm.window_role));
+}
+
+/* ARGSUSED */
+static void EventHandler(
+       Widget wid,
+       XtPointer closure,      /* unused */
+       XEvent *event,
+        Boolean *continue_to_dispatch) /* unused */
+{
+       register ShellWidget w = (ShellWidget) wid;
+       WMShellWidget wmshell = (WMShellWidget) w;
+       Boolean  sizechanged = FALSE;
+
+       if(w->core.window != event->xany.window) {
+               XtAppErrorMsg(XtWidgetToApplicationContext(wid),
+                       "invalidWindow","eventHandler",XtCXtToolkitError,
+                        "Event with wrong window",
+                       (String *)NULL, (Cardinal *)NULL);
+               return;
+       }
+
+       switch(event->type) {
+           case ConfigureNotify:
+               if (w->core.window != event->xconfigure.window)
+                   return;  /* in case of SubstructureNotify */
+#define NEQ(x) ( w->core.x != event->xconfigure.x )
+               if( NEQ(width) || NEQ(height) || NEQ(border_width) ) {
+                       sizechanged = TRUE;
+#undef NEQ
+                       w->core.width = event->xconfigure.width;
+                       w->core.height = event->xconfigure.height;
+                       w->core.border_width = event->xconfigure.border_width;
+               }
+               if (event->xany.send_event /* ICCCM compliant synthetic ev */
+                   /* || w->shell.override_redirect */
+                   || w->shell.client_specified & _XtShellNotReparented)
+               {
+                   w->core.x = event->xconfigure.x;
+                   w->core.y = event->xconfigure.y;
+                   w->shell.client_specified |= _XtShellPositionValid;
+               }
+               else w->shell.client_specified &= ~_XtShellPositionValid;
+               if (XtIsWMShell(wid) && !wmshell->wm.wait_for_wm) {
+                   /* Consider trusting the wm again */
+                   register struct _OldXSizeHints *hintp
+                       = &wmshell->wm.size_hints;
+#define EQ(x) (hintp->x == w->core.x)
+                   if (EQ(x) && EQ(y) && EQ(width) && EQ(height)) {
+                       wmshell->wm.wait_for_wm = TRUE;
+                   }
+#undef EQ
+               }
+               break;
+
+             case ReparentNotify:
+               if (event->xreparent.window == XtWindow(w)) {
+                  if (event->xreparent.parent !=
+                      RootWindowOfScreen(XtScreen(w)))
+                      w->shell.client_specified &=
+                          ~(_XtShellNotReparented | _XtShellPositionValid);
+                  else {
+                      w->core.x = event->xreparent.x;
+                      w->core.y = event->xreparent.y;
+                      w->shell.client_specified |=
+                          (_XtShellNotReparented | _XtShellPositionValid);
+                  }
+               }
+               return;
+
+              case MapNotify:
+                if (XtIsTopLevelShell(wid)) {
+                    ((TopLevelShellWidget)wid)->topLevel.iconic = FALSE;
+                }
+                return;
+
+             case UnmapNotify:
+               {
+                   XtPerDisplayInput   pdi;
+                   XtDevice            device;
+                   Widget              p;
+
+                    if (XtIsTopLevelShell(wid))
+                        ((TopLevelShellWidget)wid)->topLevel.iconic = TRUE;
+
+                   pdi = _XtGetPerDisplayInput(event->xunmap.display);
+
+                   device = &pdi->pointer;
+                   if (device->grabType == XtPassiveServerGrab) {
+                       p = device->grab.widget;
+                       while (p && !(XtIsShell(p)))
+                           p = p->core.parent;
+                       if (p == wid)
+                           device->grabType = XtNoServerGrab;
+                   }
+
+                   device = &pdi->keyboard;
+                   if (IsEitherPassiveGrab(device->grabType)) {
+                       p = device->grab.widget;
+                       while (p && !(XtIsShell(p)))
+                           p = p->core.parent;
+                       if (p == wid) {
+                           device->grabType = XtNoServerGrab;
+                           pdi->activatingKey = 0;
+                       }
+                   }
+
+                   return;
+               }
+             default:
+                return;
+       }
+       {
+       XtWidgetProc resize;
+
+       LOCK_PROCESS;
+       resize = XtClass(wid)->core_class.resize;
+       UNLOCK_PROCESS;
+
+       if (sizechanged && resize) {
+           CALLGEOTAT(_XtGeoTrace((Widget)w,
+                          "Shell \"%s\" is being resized to %d %d.\n",
+                          XtName(wid), wid->core.width, wid->core.height ));
+           (*resize)(wid);
+        }
+       }
+}
+
+static void Destroy(
+       Widget wid)
+{
+       if (XtIsRealized(wid))
+           XDestroyWindow( XtDisplay(wid), XtWindow(wid) );
+}
+
+static void WMDestroy(
+       Widget wid)
+{
+       WMShellWidget w = (WMShellWidget) wid;
+
+       XtFree((char *) w->wm.title);
+       XtFree((char *) w->wm.window_role);
+}
+
+static void TopLevelDestroy(
+       Widget wid)
+{
+       TopLevelShellWidget w = (TopLevelShellWidget) wid;
+
+       XtFree((char *) w->topLevel.icon_name);
+}
+
+static void ApplicationDestroy(
+    Widget wid)
+{
+    ApplicationShellWidget w = (ApplicationShellWidget) wid;
+    if (w->application.argc > 0)
+       FreeStringArray(w->application.argv);
+}
+
+static void SessionDestroy(
+    Widget wid)
+{
+#ifndef XT_NO_SM
+    SessionShellWidget w = (SessionShellWidget) wid;
+
+    StopManagingSession(w, w->session.connection);
+    XtFree(w->session.session_id);
+    FreeStringArray(w->session.restart_command);
+    FreeStringArray(w->session.clone_command);
+    FreeStringArray(w->session.discard_command);
+    FreeStringArray(w->session.resign_command);
+    FreeStringArray(w->session.shutdown_command);
+    FreeStringArray(w->session.environment);
+    XtFree(w->session.current_dir);
+    XtFree(w->session.program_path);
+#endif /* !XT_NO_SM */
+}
+
+/*
+ * If the Shell has a width and a height which are zero, and as such
+ * suspect, and it has not yet been realized then it will grow to
+ * match the child before parsing the geometry resource.
+ *
+ */
+static void GetGeometry(
+    Widget W, Widget child)
+{
+    register ShellWidget w = (ShellWidget)W;
+    Boolean is_wmshell = XtIsWMShell(W);
+    int x, y, width, height, win_gravity = -1, flag;
+    XSizeHints hints;
+
+    if (child != NULL) {
+       /* we default to our child's size */
+       if (is_wmshell && (w->core.width == 0 || w->core.height == 0))
+           ((WMShellWidget)W)->wm.size_hints.flags |= PSize;
+       if (w->core.width == 0)     w->core.width = child->core.width;
+       if (w->core.height == 0)    w->core.height = child->core.height;
+    }
+    if(w->shell.geometry != NULL) {
+       char def_geom[64];
+       x = w->core.x;
+       y = w->core.y;
+       width = w->core.width;
+       height = w->core.height;
+       if (is_wmshell) {
+           WMShellPart* wm = &((WMShellWidget)w)->wm;
+           EvaluateSizeHints((WMShellWidget)w);
+           (void) memmove((char*)&hints, (char*)&wm->size_hints,
+                          sizeof(struct _OldXSizeHints));
+           hints.win_gravity = wm->win_gravity;
+           if (wm->size_hints.flags & PBaseSize) {
+               width -= wm->base_width;
+               height -= wm->base_height;
+               hints.base_width = wm->base_width;
+               hints.base_height = wm->base_height;
+           }
+           else if (wm->size_hints.flags & PMinSize) {
+               width -= wm->size_hints.min_width;
+               height -= wm->size_hints.min_height;
+           }
+           if (wm->size_hints.flags & PResizeInc) {
+               width /= wm->size_hints.width_inc;
+               height /= wm->size_hints.height_inc;
+           }
+       }
+       else hints.flags = 0;
+
+       snprintf( def_geom, sizeof(def_geom), "%dx%d+%d+%d",
+                 width, height, x, y );
+       flag = XWMGeometry( XtDisplay(W),
+                           XScreenNumberOfScreen(XtScreen(W)),
+                           w->shell.geometry, def_geom,
+                           (unsigned int)w->core.border_width,
+                           &hints, &x, &y, &width, &height,
+                           &win_gravity
+                          );
+       if (flag) {
+           if (flag & XValue) w->core.x = (Position)x;
+           if (flag & YValue) w->core.y = (Position)y;
+           if (flag & WidthValue) w->core.width = (Dimension)width;
+           if (flag & HeightValue) w->core.height = (Dimension)height;
+       }
+       else {
+           String params[2];
+           Cardinal num_params = 2;
+           params[0] = XtName(W);
+           params[1] = w->shell.geometry;
+           XtAppWarningMsg(XtWidgetToApplicationContext(W),
+       "badGeometry", "shellRealize", XtCXtToolkitError,
+       "Shell widget \"%s\" has an invalid geometry specification: \"%s\"",
+                           params, &num_params);
+       }
+    }
+    else
+       flag = 0;
+
+    if (is_wmshell) {
+       WMShellWidget wmshell = (WMShellWidget) w;
+       if (wmshell->wm.win_gravity == XtUnspecifiedShellInt) {
+           if (win_gravity != -1)
+               wmshell->wm.win_gravity = win_gravity;
+           else
+               wmshell->wm.win_gravity = NorthWestGravity;
+       }
+       wmshell->wm.size_hints.flags |= PWinGravity;
+       if ((flag & (XValue|YValue)) == (XValue|YValue))
+           wmshell->wm.size_hints.flags |= USPosition;
+       if ((flag & (WidthValue|HeightValue)) == (WidthValue|HeightValue))
+           wmshell->wm.size_hints.flags |= USSize;
+    }
+    w->shell.client_specified |= _XtShellGeometryParsed;
+}
+
+
+static void ChangeManaged(Widget wid)
+{
+    ShellWidget w = (ShellWidget) wid;
+    Widget child = NULL;
+    Cardinal i;
+
+    for (i = 0; i < w->composite.num_children; i++) {
+       if (XtIsManaged(w->composite.children[i])) {
+           child = w->composite.children[i];
+           break;              /* there can only be one of them! */
+       }
+    }
+
+    if (!XtIsRealized (wid))   /* then we're about to be realized... */
+       GetGeometry(wid, child);
+
+    if (child != NULL)
+       XtConfigureWidget (child, (Position)0, (Position)0,
+                          w->core.width, w->core.height, (Dimension)0 );
+}
+
+/*
+ * This is gross, I can't wait to see if the change happened so I will ask
+ * the window manager to change my size and do the appropriate X work.
+ * I will then tell the requester that he can.  Care must be taken because
+ * it is possible that some time in the future the request will be
+ * asynchronusly denied and the window reverted to it's old size/shape.
+ */
+
+/*ARGSUSED*/
+static XtGeometryResult GeometryManager(
+       Widget wid,
+       XtWidgetGeometry *request,
+       XtWidgetGeometry *reply)
+{
+       ShellWidget shell = (ShellWidget)(wid->core.parent);
+       XtWidgetGeometry my_request;
+
+       if(shell->shell.allow_shell_resize == FALSE && XtIsRealized(wid))
+               return(XtGeometryNo);
+
+       if (request->request_mode & (CWX | CWY))
+           return(XtGeometryNo);
+
+       my_request.request_mode = (request->request_mode & XtCWQueryOnly);
+       if (request->request_mode & CWWidth) {
+           my_request.width = request->width;
+           my_request.request_mode |= CWWidth;
+       }
+       if (request->request_mode & CWHeight) {
+           my_request.height = request->height;
+           my_request.request_mode |= CWHeight;
+       }
+       if (request->request_mode & CWBorderWidth) {
+           my_request.border_width = request->border_width;
+           my_request.request_mode |= CWBorderWidth;
+       }
+       if (XtMakeGeometryRequest((Widget)shell, &my_request, NULL)
+               == XtGeometryYes) {
+           /* assert: if (request->request_mode & CWWidth) then
+            *            shell->core.width == request->width
+            * assert: if (request->request_mode & CWHeight) then
+            *            shell->core.height == request->height
+            *
+            * so, whatever the WM sized us to (if the Shell requested
+            * only one of the two) is now the correct child size
+            */
+
+           if (!(request->request_mode & XtCWQueryOnly)) {
+               wid->core.width = shell->core.width;
+               wid->core.height = shell->core.height;
+               if (request->request_mode & CWBorderWidth) {
+                   wid->core.x = wid->core.y = -request->border_width;
+               }
+           }
+           return XtGeometryYes;
+       } else return XtGeometryNo;
+}
+
+typedef struct {
+       Widget  w;
+       unsigned long request_num;
+       Boolean done;
+} QueryStruct;
+
+static Bool isMine(
+       Display *dpy,
+       register XEvent  *event,
+       char *arg)
+{
+       QueryStruct *q = (QueryStruct *) arg;
+       register Widget w = q->w;
+
+       if ( (dpy != XtDisplay(w)) || (event->xany.window != XtWindow(w)) ) {
+           return FALSE;
+       }
+       if (event->xany.serial >= q->request_num) {
+           if (event->type == ConfigureNotify) {
+               q->done = TRUE;
+               return TRUE;
+           }
+       }
+       else if (event->type == ConfigureNotify)
+           return TRUE;        /* flush old events */
+       if (event->type == ReparentNotify
+                && event->xreparent.window == XtWindow(w)) {
+           /* we might get ahead of this event, so just in case someone
+            * asks for coordinates before this event is dispatched...
+            */
+           register ShellWidget s = (ShellWidget)w;
+           if (event->xreparent.parent != RootWindowOfScreen(XtScreen(w)))
+               s->shell.client_specified &= ~_XtShellNotReparented;
+           else
+               s->shell.client_specified |= _XtShellNotReparented;
+       }
+       return FALSE;
+}
+
+static Boolean _wait_for_response(
+       ShellWidget     w,
+       XEvent          *event,
+        unsigned long  request_num)
+{
+       XtAppContext app = XtWidgetToApplicationContext((Widget) w);
+       QueryStruct q;
+       unsigned long timeout;
+
+       if (XtIsWMShell((Widget)w))
+           timeout = ((WMShellWidget)w)->wm.wm_timeout;
+       else
+           timeout = DEFAULT_WM_TIMEOUT;
+
+       XFlush(XtDisplay(w));
+       q.w = (Widget) w;
+       q.request_num = request_num;
+       q.done = FALSE;
+
+       /*
+        * look for match event and discard all prior configures
+        */
+       while (XCheckIfEvent(XtDisplay(w),event,isMine,(char*)&q)) {
+           if (q.done) return TRUE;
+       }
+
+       while (timeout > 0) {
+           if (_XtWaitForSomething (app,
+                                    FALSE, TRUE, TRUE, TRUE,
+                                    TRUE,
+#ifdef XTHREADS
+                                    FALSE,
+#endif
+                                    &timeout) != -1) {
+               while (XCheckIfEvent(XtDisplay(w),event,isMine,(char*)&q)) {
+                   if (q.done) return TRUE;
+               }
+           }
+       }
+       return FALSE;
+}
+
+/*ARGSUSED*/
+static XtGeometryResult RootGeometryManager(
+    Widget gw,
+    XtWidgetGeometry *request, XtWidgetGeometry *reply)
+{
+    register ShellWidget w = (ShellWidget)gw;
+    XWindowChanges values;
+    unsigned int mask = request->request_mode;
+    XEvent event;
+    Boolean wm;
+    register struct _OldXSizeHints *hintp = NULL;
+    int oldx, oldy, oldwidth, oldheight, oldborder_width;
+    unsigned long request_num;
+
+    CALLGEOTAT(_XtGeoTab(1));
+
+    if (XtIsWMShell(gw)) {
+       wm = True;
+       hintp = &((WMShellWidget)w)->wm.size_hints;
+       /* for draft-ICCCM wm's, need to make sure hints reflect
+          (current) reality so client can move and size separately. */
+       hintp->x = w->core.x;
+       hintp->y = w->core.y;
+       hintp->width = w->core.width;
+       hintp->height = w->core.height;
+    } else
+       wm = False;
+
+    oldx = w->core.x;
+    oldy = w->core.y;
+    oldwidth = w->core.width;
+    oldheight = w->core.height;
+    oldborder_width = w->core.border_width;
+
+#define PutBackGeometry() \
+       { w->core.x = oldx; \
+         w->core.y = oldy; \
+         w->core.width = oldwidth; \
+         w->core.height = oldheight; \
+         w->core.border_width = oldborder_width; }
+
+    if (mask & CWX) {
+           if (w->core.x == request->x) mask &= ~CWX;
+           else {
+               w->core.x = values.x = request->x;
+               if (wm) {
+                   hintp->flags &= ~USPosition;
+                   hintp->flags |= PPosition;
+                   hintp->x = values.x;
+               }
+           }
+    }
+    if (mask & CWY) {
+           if (w->core.y == request->y) mask &= ~CWY;
+           else {
+               w->core.y = values.y = request->y;
+               if (wm) {
+                   hintp->flags &= ~USPosition;
+                   hintp->flags |= PPosition;
+                   hintp->y = values.y;
+               }
+           }
+    }
+    if (mask & CWBorderWidth) {
+           if (w->core.border_width == request->border_width) {
+                   mask &= ~CWBorderWidth;
+           } else
+               w->core.border_width =
+                   values.border_width =
+                       request->border_width;
+    }
+    if (mask & CWWidth) {
+           if (w->core.width == request->width) mask &= ~CWWidth;
+           else {
+               w->core.width = values.width = request->width;
+               if (wm) {
+                   hintp->flags &= ~USSize;
+                   hintp->flags |= PSize;
+                   hintp->width = values.width;
+               }
+           }
+    }
+    if (mask & CWHeight) {
+           if (w->core.height == request->height) mask &= ~CWHeight;
+           else {
+               w->core.height = values.height = request->height;
+               if (wm) {
+                   hintp->flags &= ~USSize;
+                   hintp->flags |= PSize;
+                   hintp->height = values.height;
+               }
+           }
+    }
+    if (mask & CWStackMode) {
+       values.stack_mode = request->stack_mode;
+       if (mask & CWSibling)
+           values.sibling = XtWindow(request->sibling);
+    }
+
+    if (!XtIsRealized((Widget)w)) {
+       CALLGEOTAT(_XtGeoTrace((Widget)w,
+                     "Shell \"%s\" is not realized, return XtGeometryYes.\n",
+                      XtName((Widget)w)));
+       CALLGEOTAT(_XtGeoTab(-1));
+       return XtGeometryYes;
+    }
+
+    request_num = NextRequest(XtDisplay(w));
+
+    CALLGEOTAT(_XtGeoTrace((Widget)w,"XConfiguring the Shell X window :\n"));
+    CALLGEOTAT(_XtGeoTab(1));
+#ifdef XT_GEO_TATTLER
+    if (mask & CWX) { CALLGEOTAT(_XtGeoTrace((Widget)w,"x = %d\n",values.x));}
+    if (mask & CWY) { CALLGEOTAT(_XtGeoTrace((Widget)w,"y = %d\n",values.y));}
+    if (mask & CWWidth) { CALLGEOTAT(_XtGeoTrace((Widget)w,
+                                              "width = %d\n",values.width));}
+    if (mask & CWHeight) { CALLGEOTAT(_XtGeoTrace((Widget)w,
+                                           "height = %d\n",values.height));}
+    if (mask & CWBorderWidth) { CALLGEOTAT(_XtGeoTrace((Widget)w,
+                                 "border_width = %d\n",values.border_width));}
+#endif
+    CALLGEOTAT(_XtGeoTab(-1));
+
+    XConfigureWindow(XtDisplay((Widget)w), XtWindow((Widget)w), mask,&values);
+
+    if (wm && !w->shell.override_redirect
+       && mask & (CWX | CWY | CWWidth | CWHeight | CWBorderWidth)) {
+       _SetWMSizeHints((WMShellWidget)w);
+    }
+
+    if (w->shell.override_redirect) {
+       CALLGEOTAT(_XtGeoTrace((Widget)w,"Shell \"%s\" is override redirect, return XtGeometryYes.\n", XtName((Widget)w)));
+       CALLGEOTAT(_XtGeoTab(-1));
+       return XtGeometryYes;
+    }
+
+
+    /* If no non-stacking bits are set, there's no way to tell whether
+       or not this worked, so assume it did */
+
+    if (!(mask & ~(CWStackMode | CWSibling))) return XtGeometryYes;
+
+    if (wm && ((WMShellWidget)w)->wm.wait_for_wm == FALSE) {
+           /* the window manager is sick
+            * so I will do the work and
+            * say no so if a new WM starts up,
+            * or the current one recovers
+            * my size requests will be visible
+            */
+       CALLGEOTAT(_XtGeoTrace((Widget)w,"Shell \"%s\" has wait_for_wm == FALSE, return XtGeometryNo.\n",
+                      XtName((Widget)w)));
+       CALLGEOTAT(_XtGeoTab(-1));
+
+       PutBackGeometry();
+       return XtGeometryNo;
+    }
+
+    if (_wait_for_response(w, &event, request_num)) {
+       /* got an event */
+       if (event.type == ConfigureNotify) {
+
+#define NEQ(x, msk) ((mask & msk) && (values.x != event.xconfigure.x))
+           if (NEQ(x, CWX) ||
+               NEQ(y, CWY) ||
+               NEQ(width, CWWidth) ||
+               NEQ(height, CWHeight) ||
+               NEQ(border_width, CWBorderWidth)) {
+#ifdef XT_GEO_TATTLER
+               if (NEQ(x, CWX)) {
+                   CALLGEOTAT(_XtGeoTrace((Widget)w,
+                                          "received Configure X %d\n",
+                                          event.xconfigure.x));
+               }
+               if (NEQ(y, CWY)) {
+                   CALLGEOTAT(_XtGeoTrace((Widget)w,
+                                          "received Configure Y %d\n",
+                                          event.xconfigure.y));
+               }
+               if (NEQ(width, CWWidth)) {
+                   CALLGEOTAT(_XtGeoTrace((Widget)w,
+                                          "received Configure Width %d\n",
+                                          event.xconfigure.width));
+               }
+               if (NEQ(height, CWHeight)) {
+                   CALLGEOTAT(_XtGeoTrace((Widget)w,
+                                          "received Configure Height %d\n",
+                                          event.xconfigure.height));
+               }
+               if (NEQ(border_width, CWBorderWidth)) {
+                   CALLGEOTAT(_XtGeoTrace((Widget)w,
+                                       "received Configure BorderWidth %d\n",
+                                       event.xconfigure.border_width));
+               }
+#endif
+#undef NEQ
+               XPutBackEvent(XtDisplay(w), &event);
+               PutBackGeometry();
+               /*
+                * We just potentially re-ordered the event queue
+                * w.r.t. ConfigureNotifies with some trepidation.
+                * But this is probably a Good Thing because we
+                * will know the new true state of the world sooner
+                * this way.
+                */
+               CALLGEOTAT(_XtGeoTrace((Widget)w,
+                          "ConfigureNotify failed, return XtGeometryNo.\n"));
+               CALLGEOTAT(_XtGeoTab(-1));
+
+               return XtGeometryNo;
+           }
+           else {
+               w->core.width = event.xconfigure.width;
+               w->core.height = event.xconfigure.height;
+               w->core.border_width = event.xconfigure.border_width;
+               if (event.xany.send_event || /* ICCCM compliant synth */
+                   w->shell.client_specified & _XtShellNotReparented) {
+
+                   w->core.x = event.xconfigure.x;
+                   w->core.y = event.xconfigure.y;
+                   w->shell.client_specified |= _XtShellPositionValid;
+               }
+               else w->shell.client_specified &= ~_XtShellPositionValid;
+               CALLGEOTAT(_XtGeoTrace((Widget)w,
+                        "ConfigureNotify succeed, return XtGeometryYes.\n"));
+               CALLGEOTAT(_XtGeoTab(-1));
+               return XtGeometryYes;
+           }
+       } else if (!wm) {
+           PutBackGeometry();
+           CALLGEOTAT(_XtGeoTrace((Widget)w,
+                                  "Not wm, return XtGeometryNo.\n"));
+           CALLGEOTAT(_XtGeoTab(-1));
+           return XtGeometryNo;
+       } else XtAppWarningMsg(XtWidgetToApplicationContext((Widget)w),
+                              "internalError", "shell", XtCXtToolkitError,
+                              "Shell's window manager interaction is broken",
+                              (String *)NULL, (Cardinal *)NULL);
+    } else if (wm) { /* no event */
+       ((WMShellWidget)w)->wm.wait_for_wm = FALSE; /* timed out; must be broken */
+    }
+    PutBackGeometry();
+#undef PutBackGeometry
+    CALLGEOTAT(_XtGeoTrace((Widget)w,
+                          "Timeout passed?, return XtGeometryNo.\n"));
+    CALLGEOTAT(_XtGeoTab(-1));
+    return XtGeometryNo;
+               }
+
+/* ARGSUSED */
+static Boolean SetValues(
+       Widget old, Widget ref, Widget new,
+       ArgList args,
+       Cardinal *num_args)
+{
+       ShellWidget nw = (ShellWidget) new;
+       ShellWidget ow = (ShellWidget) old;
+       Mask mask = 0;
+       XSetWindowAttributes attr;
+
+       if (!XtIsRealized(new))
+           return False;
+
+       if (ow->shell.save_under != nw->shell.save_under) {
+           mask = CWSaveUnder;
+           attr.save_under = nw->shell.save_under;
+       }
+
+       if (ow->shell.override_redirect != nw->shell.override_redirect) {
+           mask |= CWOverrideRedirect;
+           attr.override_redirect = nw->shell.override_redirect;
+       }
+
+       if (mask) {
+           XChangeWindowAttributes(XtDisplay(new),XtWindow(new), mask, &attr);
+           if ((mask & CWOverrideRedirect) && !nw->shell.override_redirect)
+               _popup_set_prop(nw);
+       }
+
+       if (! (ow->shell.client_specified & _XtShellPositionValid)) {
+           Cardinal n;
+
+           for (n = *num_args; n; n--, args++) {
+               if (strcmp(XtNx, args->name) == 0) {
+                   _XtShellGetCoordinates((Widget)ow, &ow->core.x,
+                                                       &ow->core.y);
+               } else if (strcmp(XtNy, args->name) == 0) {
+                   _XtShellGetCoordinates((Widget)ow, &ow->core.x,
+                                                       &ow->core.y);
+               }
+           }
+       }
+       return FALSE;
+}
+
+/* ARGSUSED */
+static Boolean WMSetValues(
+       Widget old, Widget ref, Widget new,
+       ArgList args,           /* unused */
+       Cardinal *num_args)     /* unused */
+{
+       WMShellWidget nwmshell = (WMShellWidget) new;
+       WMShellWidget owmshell = (WMShellWidget) old;
+       Boolean set_prop
+           = XtIsRealized(new) && !nwmshell->shell.override_redirect;
+       Boolean title_changed;
+
+       EvaluateSizeHints(nwmshell);
+
+#define NEQ(f) (nwmshell->wm.size_hints.f != owmshell->wm.size_hints.f)
+
+       if (set_prop
+           && (NEQ(flags) || NEQ(min_width) || NEQ(min_height)
+               || NEQ(max_width) || NEQ(max_height)
+               || NEQ(width_inc) || NEQ(height_inc)
+               || NEQ(min_aspect.x) || NEQ(min_aspect.y)
+               || NEQ(max_aspect.x) || NEQ(max_aspect.y)
+#undef NEQ
+#define NEQ(f) (nwmshell->wm.f != owmshell->wm.f)
+
+               || NEQ(base_width) || NEQ(base_height) || NEQ(win_gravity))) {
+           _SetWMSizeHints(nwmshell);
+       }
+#undef NEQ
+
+       if (nwmshell->wm.title != owmshell->wm.title) {
+           XtFree(owmshell->wm.title);
+           if (! nwmshell->wm.title) nwmshell->wm.title = "";
+           nwmshell->wm.title = XtNewString(nwmshell->wm.title);
+           title_changed = True;
+       } else
+           title_changed = False;
+
+       if (set_prop
+           && (title_changed ||
+               nwmshell->wm.title_encoding != owmshell->wm.title_encoding)) {
+
+           XTextProperty title;
+           Boolean copied = False;
+
+            if (nwmshell->wm.title_encoding == None &&
+               XmbTextListToTextProperty(XtDisplay(new),
+                                         (char**)&nwmshell->wm.title,
+                                         1, XStdICCTextStyle,
+                                         &title) >= Success) {
+               copied = True;
+           } else {
+               title.value = (unsigned char*)nwmshell->wm.title;
+               title.encoding = nwmshell->wm.title_encoding ?
+                   nwmshell->wm.title_encoding : XA_STRING;
+               title.format = 8;
+               title.nitems = strlen(nwmshell->wm.title);
+           }
+           XSetWMName(XtDisplay(new), XtWindow(new), &title);
+           if (copied)
+               XFree((XPointer)title.value);
+       }
+
+       EvaluateWMHints(nwmshell);
+
+#define NEQ(f) (nwmshell->wm.wm_hints.f != owmshell->wm.wm_hints.f)
+
+       if (set_prop
+           && (NEQ(flags) || NEQ(input) || NEQ(initial_state)
+               || NEQ(icon_x) || NEQ(icon_y)
+               || NEQ(icon_pixmap) || NEQ(icon_mask) || NEQ(icon_window)
+               || NEQ(window_group))) {
+
+           XSetWMHints(XtDisplay(new), XtWindow(new), &nwmshell->wm.wm_hints);
+       }
+#undef NEQ
+
+       if (XtIsRealized(new) &&
+           nwmshell->wm.transient != owmshell->wm.transient) {
+           if (nwmshell->wm.transient) {
+               if (!XtIsTransientShell(new) &&
+                   !nwmshell->shell.override_redirect &&
+                   nwmshell->wm.wm_hints.window_group !=
+                      XtUnspecifiedWindowGroup)
+                   XSetTransientForHint(XtDisplay(new), XtWindow(new),
+                                        nwmshell->wm.wm_hints.window_group);
+           }
+           else XDeleteProperty(XtDisplay(new), XtWindow(new),
+                                XA_WM_TRANSIENT_FOR);
+       }
+
+       if (nwmshell->wm.client_leader != owmshell->wm.client_leader
+           && XtWindow(new) && !nwmshell->shell.override_redirect) {
+           Widget leader = GetClientLeader(new);
+           if (XtWindow(leader))
+               XChangeProperty(XtDisplay(new), XtWindow(new),
+                               XInternAtom(XtDisplay(new),
+                                           "WM_CLIENT_LEADER", False),
+                               XA_WINDOW, 32, PropModeReplace,
+                               (unsigned char *) &(leader->core.window), 1);
+       }
+
+       if (nwmshell->wm.window_role != owmshell->wm.window_role) {
+           XtFree(owmshell->wm.window_role);
+           if (set_prop && nwmshell->wm.window_role) {
+               XChangeProperty(XtDisplay(new), XtWindow(new),
+                               XInternAtom(XtDisplay(new), "WM_WINDOW_ROLE",
+                                           False),
+                               XA_STRING, 8, PropModeReplace,
+                               (unsigned char *)nwmshell->wm.window_role,
+                               strlen(nwmshell->wm.window_role));
+           } else if (XtIsRealized(new) && ! nwmshell->wm.window_role) {
+               XDeleteProperty(XtDisplay(new), XtWindow(new),
+                               XInternAtom(XtDisplay(new), "WM_WINDOW_ROLE",
+                                           False));
+           }
+       }
+
+       return FALSE;
+}
+
+/*ARGSUSED*/
+static Boolean TransientSetValues(
+     Widget oldW, Widget refW, Widget newW,
+     ArgList args,             /* unused */
+     Cardinal *num_args)       /* unused */
+{
+    TransientShellWidget old = (TransientShellWidget)oldW;
+    TransientShellWidget new = (TransientShellWidget)newW;
+
+    if (XtIsRealized(newW)
+       && ((new->wm.transient && !old->wm.transient)
+           || ((new->transient.transient_for != old->transient.transient_for)
+               || (new->transient.transient_for == NULL
+                   && (new->wm.wm_hints.window_group
+                       != old->wm.wm_hints.window_group))))) {
+
+       _SetTransientForHint(new, True);
+    }
+    return False;
+}
+
+
+/* ARGSUSED */
+static Boolean TopLevelSetValues(
+     Widget oldW, Widget refW, Widget newW,
+     ArgList args,             /* unused */
+     Cardinal *num_args)       /* unused */
+{
+    TopLevelShellWidget old = (TopLevelShellWidget)oldW;
+    TopLevelShellWidget new = (TopLevelShellWidget)newW;
+    Boolean name_changed;
+
+    if (old->topLevel.icon_name != new->topLevel.icon_name) {
+       XtFree((XtPointer)old->topLevel.icon_name);
+       if (! new->topLevel.icon_name) new->topLevel.icon_name = "";
+       new->topLevel.icon_name = XtNewString(new->topLevel.icon_name);
+       name_changed = True;
+    } else
+       name_changed = False;
+
+    if (XtIsRealized(newW)) {
+       if (new->topLevel.iconic != old->topLevel.iconic) {
+           if (new->topLevel.iconic)
+               XIconifyWindow(XtDisplay(newW),
+                              XtWindow(newW),
+                              XScreenNumberOfScreen(XtScreen(newW))
+                              );
+           else {
+               Boolean map = new->shell.popped_up;
+               XtPopup(newW, XtGrabNone);
+               if (map) XMapWindow(XtDisplay(newW), XtWindow(newW));
+           }
+       }
+
+       if (!new->shell.override_redirect &&
+           (name_changed ||
+            (old->topLevel.icon_name_encoding
+             != new->topLevel.icon_name_encoding))) {
+
+           XTextProperty icon_name;
+           Boolean copied = False;
+
+            if (new->topLevel.icon_name_encoding == None &&
+               XmbTextListToTextProperty(XtDisplay(newW),
+                                         (char**) &new->topLevel.icon_name,
+                                         1, XStdICCTextStyle,
+                                         &icon_name) >= Success) {
+               copied = True;
+           } else {
+               icon_name.value = (unsigned char *)new->topLevel.icon_name;
+               icon_name.encoding = new->topLevel.icon_name_encoding ?
+                   new->topLevel.icon_name_encoding : XA_STRING;
+               icon_name.format = 8;
+               icon_name.nitems = strlen((char *)icon_name.value);
+           }
+           XSetWMIconName(XtDisplay(newW), XtWindow(newW), &icon_name);
+           if (copied)
+               XFree((XPointer)icon_name.value);
+       }
+    }
+    else if (new->topLevel.iconic != old->topLevel.iconic) {
+       if (new->topLevel.iconic)
+           new->wm.wm_hints.initial_state = IconicState;
+    }
+    return False;
+}
+
+static String * NewArgv(
+    int count,
+    String *str)  /* do not assume it's terminated by a NULL element */
+{
+    Cardinal nbytes = 0;
+    Cardinal num = 0;
+    String *newarray, *new;
+    String *strarray = str;
+    String sptr;
+
+    if (count <= 0 || !str) return NULL;
+
+    for (num = count; num--; str++) {
+       nbytes += strlen(*str);
+       nbytes++;
+    }
+    num = (count+1) * sizeof(String);
+    new = newarray = (String *) __XtMalloc(num + nbytes);
+    sptr = ((char *) new) + num;
+
+    for (str = strarray; count--; str++) {
+       *new = sptr;
+       strcpy(*new, *str);
+       new++;
+       sptr = strchr(sptr, '\0');
+       sptr++;
+    }
+    *new = NULL;
+    return newarray;
+}
+
+
+/*ARGSUSED*/
+static Boolean ApplicationSetValues(
+    Widget current, Widget request, Widget new,
+    ArgList args,
+    Cardinal *num_args)
+{
+    ApplicationShellWidget nw = (ApplicationShellWidget) new;
+    ApplicationShellWidget cw = (ApplicationShellWidget) current;
+
+    if (cw->application.argc != nw->application.argc ||
+       cw->application.argv != nw->application.argv) {
+
+       if (nw->application.argc > 0)
+           nw->application.argv = NewArgv(nw->application.argc,
+                                          nw->application.argv);
+       if (cw->application.argc > 0)
+           FreeStringArray(cw->application.argv);
+
+       if (XtIsRealized(new) && !nw->shell.override_redirect) {
+           if (nw->application.argc >= 0 && nw->application.argv)
+               XSetCommand(XtDisplay(new), XtWindow(new),
+                           nw->application.argv, nw->application.argc);
+           else
+               XDeleteProperty(XtDisplay(new), XtWindow(new), XA_WM_COMMAND);
+       }
+    }
+    return False;
+}
+
+/*ARGSUSED*/
+static Boolean SessionSetValues(
+    Widget current, Widget request, Widget new,
+    ArgList args,
+    Cardinal *num_args)
+{
+#ifndef XT_NO_SM
+    SessionShellWidget nw = (SessionShellWidget) new;
+    SessionShellWidget cw = (SessionShellWidget) current;
+    unsigned long set_mask = 0UL;
+    unsigned long unset_mask = 0UL;
+    Boolean initialize = False;
+
+    if (cw->session.session_id != nw->session.session_id) {
+       nw->session.session_id = XtNewString(nw->session.session_id);
+       XtFree(cw->session.session_id);
+    }
+
+    if (cw->session.clone_command != nw->session.clone_command) {
+       if (nw->session.clone_command) {
+           nw->session.clone_command =
+               NewStringArray(nw->session.clone_command);
+           set_mask |= XtCloneCommandMask;
+       } else unset_mask |= XtCloneCommandMask;
+       FreeStringArray(cw->session.clone_command);
+    }
+
+    if (cw->session.current_dir != nw->session.current_dir) {
+       if (nw->session.current_dir) {
+           nw->session.current_dir =
+               XtNewString(nw->session.current_dir);
+           set_mask |= XtCurrentDirectoryMask;
+       } else unset_mask |= XtCurrentDirectoryMask;
+       XtFree((char *) cw->session.current_dir);
+    }
+
+    if (cw->session.discard_command != nw->session.discard_command) {
+       if (nw->session.discard_command) {
+           nw->session.discard_command =
+               NewStringArray(nw->session.discard_command);
+           set_mask |=  XtDiscardCommandMask;
+       } else unset_mask |= XtDiscardCommandMask;
+       FreeStringArray(cw->session.discard_command);
+    }
+
+    if (cw->session.environment != nw->session.environment) {
+       if (nw->session.environment) {
+           nw->session.environment =
+               NewStringArray(nw->session.environment);
+           set_mask |= XtEnvironmentMask;
+       } else unset_mask |= XtEnvironmentMask;
+       FreeStringArray(cw->session.environment);
+    }
+
+    if (cw->session.program_path != nw->session.program_path) {
+       if (nw->session.program_path) {
+           nw->session.program_path =
+               XtNewString(nw->session.program_path);
+           set_mask |= XtProgramMask;
+       } else unset_mask |= XtProgramMask;
+       XtFree((char *) cw->session.program_path);
+    }
+
+    if (cw->session.resign_command != nw->session.resign_command) {
+       if (nw->session.resign_command) {
+           nw->session.resign_command =
+               NewStringArray(nw->session.resign_command);
+           set_mask |= XtResignCommandMask;
+       } else set_mask |= XtResignCommandMask;
+       FreeStringArray(cw->session.resign_command);
+    }
+
+    if (cw->session.restart_command != nw->session.restart_command) {
+       if (nw->session.restart_command) {
+           nw->session.restart_command =
+               NewStringArray(nw->session.restart_command);
+           set_mask |= XtRestartCommandMask;
+       } else unset_mask |= XtRestartCommandMask;
+       FreeStringArray(cw->session.restart_command);
+    }
+
+    if (cw->session.restart_style != nw->session.restart_style)
+       set_mask |= XtRestartStyleHintMask;
+
+    if (cw->session.shutdown_command != nw->session.shutdown_command) {
+       if (nw->session.shutdown_command) {
+           nw->session.shutdown_command =
+               NewStringArray(nw->session.shutdown_command);
+           set_mask |= XtShutdownCommandMask;
+       } else unset_mask |= XtShutdownCommandMask;
+       FreeStringArray(cw->session.shutdown_command);
+    }
+
+    if ((!cw->session.join_session && nw->session.join_session) ||
+       (!cw->session.connection && nw->session.connection)) {
+       JoinSession(nw);
+       initialize = True;
+    }
+
+    if (nw->session.connection && (set_mask || unset_mask || initialize))
+       SetSessionProperties((SessionShellWidget) new, initialize, set_mask, unset_mask);
+
+    if ((cw->session.join_session && !nw->session.join_session) ||
+       (cw->session.connection && !nw->session.connection))
+       StopManagingSession(nw, nw->session.connection);
+#endif /* !XT_NO_SM */
+
+    if (cw->wm.client_leader != nw->wm.client_leader ||
+       cw->session.session_id != nw->session.session_id) {
+       Widget leader;
+       if (cw->session.session_id) {
+           leader = GetClientLeader(current);
+           if (XtWindow(leader))
+               XDeleteProperty(XtDisplay(leader), XtWindow(leader),
+                               XInternAtom(XtDisplay(leader), "SM_CLIENT_ID",
+                                           False));
+       }
+       if (nw->session.session_id) {
+           leader = GetClientLeader(new);
+           if (XtWindow(leader))
+               XChangeProperty(XtDisplay(leader), XtWindow(leader),
+                               XInternAtom(XtDisplay(leader), "SM_CLIENT_ID",
+                                           False),
+                               XA_STRING, 8, PropModeReplace,
+                               (unsigned char *) nw->session.session_id,
+                               strlen(nw->session.session_id));
+       }
+    }
+    return False;
+}
+
+void _XtShellGetCoordinates(
+    Widget widget,
+    Position* x,
+    Position* y)
+{
+    ShellWidget w = (ShellWidget)widget;
+    if (XtIsRealized(widget) &&
+       !(w->shell.client_specified & _XtShellPositionValid)) {
+       int tmpx, tmpy;
+       Window tmpchild;
+       (void) XTranslateCoordinates(XtDisplay(w), XtWindow(w),
+                                    RootWindowOfScreen(XtScreen(w)),
+                                    (int) -w->core.border_width,
+                                    (int) -w->core.border_width,
+                                    &tmpx, &tmpy, &tmpchild);
+       w->core.x = tmpx;
+       w->core.y = tmpy;
+       w->shell.client_specified |= _XtShellPositionValid;
+    }
+    *x = w->core.x;
+    *y = w->core.y;
+}
+
+static void GetValuesHook(
+    Widget     widget,
+    ArgList    args,
+    Cardinal*  num_args)
+{
+    ShellWidget w = (ShellWidget) widget;
+
+    /* x and y resource values may be invalid after a shell resize */
+    if (XtIsRealized(widget) &&
+       !(w->shell.client_specified & _XtShellPositionValid)) {
+       Cardinal        n;
+       Position        x, y;
+
+       for (n = *num_args; n; n--, args++) {
+           if (strcmp(XtNx, args->name) == 0) {
+               _XtShellGetCoordinates(widget, &x, &y);
+               _XtCopyToArg((char *) &x, &args->value, sizeof(Position));
+           } else if (strcmp(XtNy, args->name) == 0) {
+               _XtShellGetCoordinates(widget, &x, &y);
+               _XtCopyToArg((char *) &y, &args->value, sizeof(Position));
+           }
+       }
+    }
+}
+
+static void ApplicationShellInsertChild(
+    Widget widget)
+{
+    if (! XtIsWidget(widget) && XtIsRectObj(widget)) {
+       XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+              "invalidClass", "applicationShellInsertChild", XtCXtToolkitError,
+              "ApplicationShell does not accept RectObj children; ignored",
+              (String*)NULL, (Cardinal*)NULL);
+    }
+    else {
+       XtWidgetProc insert_child;
+
+       LOCK_PROCESS;
+       insert_child =
+           ((CompositeWidgetClass)applicationShellClassRec.core_class.
+          superclass)->composite_class.insert_child;
+       UNLOCK_PROCESS;
+       (*insert_child) (widget);
+    }
+}
+
+/**************************************************************************
+
+  Session Protocol Participation
+
+ *************************************************************************/
+
+#define XtSessionCheckpoint    0
+#define XtSessionInteract      1
+
+static void CallSaveCallbacks(SessionShellWidget );
+static String *EditCommand(String, String *, String *);
+static Boolean ExamineToken(XtPointer);
+static void GetIceEvent(XtPointer, int *, XtInputId *);
+static XtCheckpointToken GetToken(Widget, int);
+static void XtCallCancelCallbacks(SmcConn, SmPointer);
+static void XtCallDieCallbacks(SmcConn, SmPointer);
+static void XtCallSaveCallbacks(SmcConn, SmPointer, int, Bool, int, Bool);
+static void XtCallSaveCompleteCallbacks(SmcConn, SmPointer);
+
+#ifndef XT_NO_SM
+static void StopManagingSession(
+    SessionShellWidget w,
+    SmcConn connection) /* connection to close, if any */
+{
+    if (connection)
+       SmcCloseConnection(connection, 0, NULL);
+
+    if (w->session.input_id) {
+       XtRemoveInput(w->session.input_id);
+       w->session.input_id = 0;
+    }
+    w->session.connection = NULL;
+}
+
+#define XT_MSG_LENGTH 256
+static void JoinSession(
+    SessionShellWidget w)
+{
+    IceConn ice_conn;
+    SmcCallbacks smcb;
+    char * sm_client_id;
+    unsigned long mask;
+    static char context;  /* used to guarantee the connection isn't shared */
+
+    smcb.save_yourself.callback = XtCallSaveCallbacks;
+    smcb.die.callback = XtCallDieCallbacks;
+    smcb.save_complete.callback = XtCallSaveCompleteCallbacks;
+    smcb.shutdown_cancelled.callback = XtCallCancelCallbacks;
+    smcb.save_yourself.client_data = smcb.die.client_data =
+       smcb.save_complete.client_data =
+           smcb.shutdown_cancelled.client_data = (SmPointer) w;
+    mask = SmcSaveYourselfProcMask | SmcDieProcMask |
+       SmcSaveCompleteProcMask | SmcShutdownCancelledProcMask;
+
+    if (w->session.connection) {
+       SmcModifyCallbacks(w->session.connection, mask, &smcb);
+       sm_client_id = SmcClientID(w->session.connection);
+    } else if (getenv("SESSION_MANAGER")) {
+       char error_msg[XT_MSG_LENGTH];
+       error_msg[0] = '\0';
+       w->session.connection =
+           SmcOpenConnection(NULL, &context, SmProtoMajor, SmProtoMinor,
+                             mask, &smcb, w->session.session_id,
+                             &sm_client_id, XT_MSG_LENGTH, error_msg);
+       if (error_msg[0]) {
+           String params[1];
+           Cardinal num_params = 1;
+           params[0] = error_msg;
+           XtAppWarningMsg(XtWidgetToApplicationContext((Widget) w),
+                           "sessionManagement", "SmcOpenConnection",
+                           XtCXtToolkitError,
+                           "Tried to connect to session manager, %s",
+                           params, &num_params);
+       }
+    }
+
+    if (w->session.connection) {
+       if (w->session.session_id == NULL
+           || (strcmp(w->session.session_id, sm_client_id) != 0)) {
+           XtFree(w->session.session_id);
+           w->session.session_id = XtNewString(sm_client_id);
+       }
+       free(sm_client_id);
+       ice_conn = SmcGetIceConnection(w->session.connection);
+       w->session.input_id =
+           XtAppAddInput(XtWidgetToApplicationContext((Widget)w),
+                         IceConnectionNumber(ice_conn),
+                         (XtPointer) XtInputReadMask,
+                         GetIceEvent, (XtPointer) w);
+
+       w->session.restart_command =
+           EditCommand(w->session.session_id, w->session.restart_command,
+                       w->application.argv);
+
+       if (! w->session.clone_command) w->session.clone_command =
+           EditCommand(NULL, NULL, w->session.restart_command);
+
+       if (! w->session.program_path)
+           w->session.program_path = w->session.restart_command
+               ? XtNewString(w->session.restart_command[0]) : NULL;
+    }
+}
+#undef XT_MSG_LENGTH
+
+#endif /* !XT_NO_SM */
+
+static String * NewStringArray(String *str)
+{
+    Cardinal nbytes = 0;
+    Cardinal num = 0;
+    String *newarray, *new;
+    String *strarray = str;
+    String sptr;
+
+    if (!str) return NULL;
+
+    for (num = 0; *str; num++, str++) {
+       nbytes += strlen(*str);
+       nbytes++;
+    }
+    num = (num + 1) * sizeof(String);
+    new = newarray = (String *) __XtMalloc(num + nbytes);
+    sptr = ((char *) new) + num;
+
+    for (str = strarray; *str; str++) {
+       *new = sptr;
+       strcpy(*new, *str);
+       new++;
+       sptr = strchr(sptr, '\0');
+       sptr++;
+    }
+    *new = NULL;
+    return newarray;
+}
+
+static void FreeStringArray(String *str)
+{
+    if (str)
+       XtFree((char *) str);
+}
+
+
+#ifndef XT_NO_SM
+static SmProp * CardPack(
+    char *name,
+    XtPointer closure)
+{
+    unsigned char *prop = (unsigned char *) closure;
+    SmProp *p;
+
+    p = (SmProp *) __XtMalloc(sizeof(SmProp) + sizeof(SmPropValue));
+    p->vals = (SmPropValue *) (((char *) p) + sizeof(SmProp));
+    p->num_vals = 1;
+    p->type = SmCARD8;
+    p->name = name;
+    p->vals->length = 1;
+    p->vals->value = (SmPointer) prop;
+    return p;
+}
+
+static SmProp * ArrayPack(char *name, XtPointer closure)
+{
+    String prop = *(String *) closure;
+    SmProp *p;
+
+    p = (SmProp *) __XtMalloc(sizeof(SmProp) + sizeof(SmPropValue));
+    p->vals = (SmPropValue *) (((char *) p) + sizeof(SmProp));
+    p->num_vals = 1;
+    p->type = SmARRAY8;
+    p->name = name;
+    p->vals->length = strlen(prop) + 1;
+    p->vals->value = prop;
+    return p;
+}
+
+static SmProp * ListPack(
+    char *name,
+    XtPointer closure)
+{
+    String *prop = *(String **) closure;
+    SmProp *p;
+    String *ptr;
+    SmPropValue *vals;
+    int n = 0;
+
+    for (ptr = prop; *ptr; ptr++)
+       n++;
+    p = (SmProp*) __XtMalloc(sizeof(SmProp) + (Cardinal)(n*sizeof(SmPropValue)));
+    p->vals = (SmPropValue *) (((char *) p) + sizeof(SmProp));
+    p->num_vals = n;
+    p->type = SmLISTofARRAY8;
+    p->name = name;
+    for (ptr = prop, vals = p->vals; *ptr; ptr++, vals++) {
+       vals->length = strlen(*ptr) + 1;
+       vals->value = *ptr;
+    }
+    return p;
+}
+
+static void FreePacks(
+    SmProp **props,
+    int num_props)
+{
+    while (--num_props >= 0)
+       XtFree((char *) props[num_props]);
+}
+
+typedef SmProp* (*PackProc)(char *, XtPointer);
+
+typedef struct PropertyRec {
+    char *     name;
+    int                offset;
+    PackProc   proc;
+} PropertyRec, *PropertyTable;
+
+#define Offset(x) (XtOffsetOf(SessionShellRec, x))
+static PropertyRec propertyTable[] = {
+  {SmCloneCommand,     Offset(session.clone_command),    ListPack},
+  {SmCurrentDirectory, Offset(session.current_dir),      ArrayPack},
+  {SmDiscardCommand,   Offset(session.discard_command),  ListPack},
+  {SmEnvironment,      Offset(session.environment),      ListPack},
+  {SmProgram,          Offset(session.program_path),     ArrayPack},
+  {SmResignCommand,    Offset(session.resign_command),   ListPack},
+  {SmRestartCommand,   Offset(session.restart_command),  ListPack},
+  {SmRestartStyleHint, Offset(session.restart_style),    CardPack},
+  {SmShutdownCommand,  Offset(session.shutdown_command), ListPack}
+};
+#undef Offset
+
+#define XT_NUM_SM_PROPS 11
+
+static void SetSessionProperties(
+    SessionShellWidget w,
+    Boolean initialize,
+    unsigned long set_mask,
+    unsigned long unset_mask)
+{
+    PropertyTable p = propertyTable;
+    int n;
+    int num_props = 0;
+    XtPointer *addr;
+    unsigned long mask;
+    SmProp *props[XT_NUM_SM_PROPS];
+    char *pnames[XT_NUM_SM_PROPS];
+
+    if (w->session.connection == NULL)
+       return;
+
+    if (initialize) {
+       char nam_buf[32];
+       char pid[12];
+       String user_name;
+       String pidp = pid;
+
+       /* set all non-NULL session properties, the UserID and the ProcessID */
+       for (n = XtNumber(propertyTable); n; n--, p++) {
+           addr = (XtPointer *) ((char *) w + p->offset);
+           if (p->proc == CardPack) {
+               if (*(unsigned char *)addr)
+                   props[num_props++] =(*(p->proc))(p->name, (XtPointer)addr);
+           }
+           else if (* addr)
+               props[num_props++] = (*(p->proc))(p->name, (XtPointer)addr);
+
+       }
+       user_name = _XtGetUserName(nam_buf, sizeof nam_buf);
+       if (user_name)
+           props[num_props++] = ArrayPack(SmUserID, &user_name);
+       snprintf(pid, sizeof(pid), "%ld", (long)getpid());
+       props[num_props++] = ArrayPack(SmProcessID, &pidp);
+
+       if (num_props) {
+           SmcSetProperties(w->session.connection, num_props, props);
+           FreePacks(props, num_props);
+       }
+       return;
+    }
+
+    if (set_mask) {
+       mask = 1L;
+       for (n = XtNumber(propertyTable); n; n--, p++, mask <<= 1)
+           if (mask & set_mask) {
+               addr = (XtPointer *) ((char *) w + p->offset);
+               props[num_props++] = (*(p->proc))(p->name, (XtPointer)addr);
+           }
+       SmcSetProperties(w->session.connection, num_props, props);
+       FreePacks(props, num_props);
+    }
+
+    if (unset_mask) {
+       mask = 1L;
+       num_props = 0;
+       for (n = XtNumber(propertyTable); n; n--, p++, mask <<= 1)
+           if (mask & unset_mask)
+               pnames[num_props++] = p->name;
+       SmcDeleteProperties(w->session.connection, num_props, pnames);
+    }
+}
+
+/*ARGSUSED*/
+static void GetIceEvent(
+    XtPointer  client_data,
+    int *      source,
+    XtInputId *        id)
+{
+    SessionShellWidget w = (SessionShellWidget) client_data;
+    IceProcessMessagesStatus status;
+
+    status = IceProcessMessages(SmcGetIceConnection(w->session.connection),
+                               NULL, NULL);
+
+    if (status == IceProcessMessagesIOError) {
+       StopManagingSession(w, w->session.connection);
+       XtCallCallbackList((Widget)w, w->session.error_callbacks,
+                          (XtPointer) NULL);
+    }
+}
+
+static void CleanUpSave(
+    SessionShellWidget w)
+{
+    XtSaveYourself next = w->session.save->next;
+    XtFree((char *)w->session.save);
+    w->session.save = next;
+    if (w->session.save)
+       CallSaveCallbacks(w);
+}
+
+static void CallSaveCallbacks(
+    SessionShellWidget w)
+{
+    XtCheckpointToken token;
+
+    if (XtHasCallbacks((Widget) w, XtNsaveCallback) != XtCallbackHasSome) {
+       /* if the application makes no attempt to save state, report failure */
+       SmcSaveYourselfDone(w->session.connection, False);
+       CleanUpSave(w);
+    } else {
+       w->session.checkpoint_state = XtSaveActive;
+       token = GetToken((Widget) w, XtSessionCheckpoint);
+       _XtCallConditionalCallbackList((Widget)w, w->session.save_callbacks,
+                                      (XtPointer)token, ExamineToken);
+       XtSessionReturnToken(token);
+    }
+}
+
+/*ARGSUSED*/
+static void XtCallSaveCallbacks(
+    SmcConn    connection,     /* unused */
+    SmPointer  client_data,
+    int                save_type,
+    Bool       shutdown,
+    int                interact,
+    Bool       fast)
+{
+    SessionShellWidget w = (SessionShellWidget) client_data;
+    XtSaveYourself save;
+    XtSaveYourself prev;
+
+    save = XtNew(XtSaveYourselfRec);
+    save->next = NULL;
+    save->save_type = save_type;
+    save->interact_style = interact;
+    save->shutdown = shutdown;
+    save->fast = fast;
+    save->cancel_shutdown = False;
+    save->phase = 1;
+    save->interact_dialog_type = SmDialogNormal;
+    save->request_cancel = save->request_next_phase = False;
+    save->save_success = True;
+    save->save_tokens = save->interact_tokens = 0;
+
+    prev = (XtSaveYourself) &w->session.save;
+    while (prev->next)
+       prev = prev->next;
+    prev->next = save;
+
+    if (w->session.checkpoint_state == XtSaveInactive)
+       CallSaveCallbacks(w);
+}
+
+static void XtInteractPermission(
+    SmcConn    connection,
+    SmPointer  data)
+{
+    Widget w = (Widget) data;
+    SessionShellWidget sw = (SessionShellWidget) data;
+    XtCheckpointToken token;
+    XtCallbackProc callback;
+    XtPointer client_data;
+
+
+    _XtPeekCallback(w, sw->session.interact_callbacks, &callback,
+                   &client_data);
+    if (callback) {
+       sw->session.checkpoint_state = XtInteractActive;
+       token = GetToken(w, XtSessionInteract);
+       XtRemoveCallback(w, XtNinteractCallback, callback, client_data);
+       (*callback)(w, client_data, (XtPointer) token);
+    } else if (! sw->session.save->cancel_shutdown) {
+       SmcInteractDone(connection, False);
+    }
+}
+
+/*ARGSUSED*/
+static void XtCallSaveCompleteCallbacks(
+    SmcConn    connection,
+    SmPointer  client_data)
+{
+    SessionShellWidget w =  (SessionShellWidget) client_data;
+
+    XtCallCallbackList((Widget)w, w->session.save_complete_callbacks,
+                      (XtPointer) NULL);
+}
+
+/*ARGSUSED*/
+static void XtCallNextPhaseCallbacks(
+    SmcConn    connection,     /* unused */
+    SmPointer  client_data)
+{
+    SessionShellWidget w =  (SessionShellWidget) client_data;
+    w->session.save->phase = 2;
+    CallSaveCallbacks(w);
+}
+
+/*ARGSUSED*/
+static void XtCallDieCallbacks(
+    SmcConn    connection,     /* unused */
+    SmPointer  client_data)
+{
+    SessionShellWidget w =  (SessionShellWidget) client_data;
+
+    StopManagingSession(w, w->session.connection);
+    XtCallCallbackList((Widget)w, w->session.die_callbacks,
+                      (XtPointer) NULL);
+}
+
+/*ARGSUSED*/
+static void XtCallCancelCallbacks(
+    SmcConn    connection,     /* unused */
+    SmPointer  client_data)
+{
+    SessionShellWidget w = (SessionShellWidget) client_data;
+    Boolean call_interacts = False;
+
+    if (w->session.checkpoint_state != XtSaveInactive) {
+       w->session.save->cancel_shutdown = True;
+       call_interacts = (w->session.save->interact_style !=
+                         SmInteractStyleNone);
+    }
+
+    XtCallCallbackList((Widget)w, w->session.cancel_callbacks,
+                      (XtPointer) NULL);
+
+    if (call_interacts) {
+       w->session.save->interact_style = SmInteractStyleNone;
+       XtInteractPermission(w->session.connection, (SmPointer) w);
+    }
+
+    if (w->session.checkpoint_state != XtSaveInactive) {
+       if (w->session.save->save_tokens == 0 &&
+           w->session.checkpoint_state == XtSaveActive) {
+           w->session.checkpoint_state = XtSaveInactive;
+           SmcSaveYourselfDone(w->session.connection,
+                               w->session.save->save_success);
+           CleanUpSave(w);
+       }
+    }
+}
+
+static XtCheckpointToken GetToken(
+    Widget     widget,
+    int                type)
+{
+    SessionShellWidget w = (SessionShellWidget) widget;
+    XtCheckpointToken token;
+    XtSaveYourself save = w->session.save;
+
+    if (type == XtSessionCheckpoint)
+       w->session.save->save_tokens++;
+    else if (type == XtSessionInteract)
+       w->session.save->interact_tokens++;
+    else
+       return (XtCheckpointToken) NULL;
+
+    token = (XtCheckpointToken) __XtMalloc(sizeof(XtCheckpointTokenRec));
+    token->save_type = save->save_type;
+    token->interact_style = save->interact_style;
+    token->shutdown = save->shutdown;
+    token->fast = save->fast;
+    token->cancel_shutdown = save->cancel_shutdown;
+    token->phase = save->phase;
+    token->interact_dialog_type = save->interact_dialog_type;
+    token->request_cancel = save->request_cancel;
+    token->request_next_phase = save->request_next_phase;
+    token->save_success = save->save_success;
+    token->type = type;
+    token->widget = widget;
+    return token;
+}
+
+XtCheckpointToken XtSessionGetToken(Widget widget)
+{
+    SessionShellWidget w = (SessionShellWidget) widget;
+    XtCheckpointToken token = NULL;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    if (w->session.checkpoint_state)
+       token = GetToken(widget, XtSessionCheckpoint);
+
+    UNLOCK_APP(app);
+    return token;
+}
+
+static Boolean ExamineToken(
+    XtPointer  call_data)
+{
+    XtCheckpointToken token = (XtCheckpointToken) call_data;
+    SessionShellWidget w = (SessionShellWidget) token->widget;
+
+    if (token->interact_dialog_type == SmDialogError)
+       w->session.save->interact_dialog_type = SmDialogError;
+    if (token->request_next_phase)
+       w->session.save->request_next_phase = True;
+    if (! token->save_success)
+       w->session.save->save_success = False;
+
+    token->interact_dialog_type = w->session.save->interact_dialog_type;
+    token->request_next_phase = w->session.save->request_next_phase;
+    token->save_success = w->session.save->save_success;
+    token->cancel_shutdown = w->session.save->cancel_shutdown;
+
+    return True;
+}
+
+void XtSessionReturnToken(XtCheckpointToken token)
+{
+    SessionShellWidget w = (SessionShellWidget) token->widget;
+    Boolean has_some;
+    Boolean phase_done;
+    XtCallbackProc callback;
+    XtPointer client_data;
+    WIDGET_TO_APPCON((Widget)w);
+
+    LOCK_APP(app);
+
+    has_some = (XtHasCallbacks(token->widget, XtNinteractCallback)
+               == XtCallbackHasSome);
+
+    (void) ExamineToken((XtPointer) token);
+
+    if (token->type == XtSessionCheckpoint) {
+       w->session.save->save_tokens--;
+       if (has_some && w->session.checkpoint_state == XtSaveActive) {
+           w->session.checkpoint_state = XtInteractPending;
+           SmcInteractRequest(w->session.connection,
+                              w->session.save->interact_dialog_type,
+                              XtInteractPermission, (SmPointer) w);
+       }
+       XtFree((char*) token);
+    } else {
+       if (token->request_cancel)
+           w->session.save->request_cancel = True;
+       token->request_cancel = w->session.save->request_cancel;
+       if (has_some) {
+           _XtPeekCallback((Widget)w, w->session.interact_callbacks,
+                           &callback, &client_data);
+           XtRemoveCallback((Widget)w, XtNinteractCallback,
+                            callback, client_data);
+           (*callback)((Widget)w, client_data, (XtPointer)token);
+       } else {
+           w->session.save->interact_tokens--;
+           if (w->session.save->interact_tokens == 0) {
+               w->session.checkpoint_state = XtSaveActive;
+               if (! w->session.save->cancel_shutdown)
+                   SmcInteractDone(w->session.connection,
+                                   w->session.save->request_cancel);
+           }
+           XtFree((char *) token);
+       }
+    }
+
+    phase_done = (w->session.save->save_tokens == 0 &&
+                 w->session.checkpoint_state == XtSaveActive);
+
+    if (phase_done) {
+       if (w->session.save->request_next_phase &&
+           w->session.save->phase == 1) {
+           SmcRequestSaveYourselfPhase2(w->session.connection,
+                                        XtCallNextPhaseCallbacks,
+                                        (SmPointer)w);
+       } else {
+           w->session.checkpoint_state = XtSaveInactive;
+           SmcSaveYourselfDone(w->session.connection,
+                               w->session.save->save_success);
+           CleanUpSave(w);
+       }
+    }
+
+    UNLOCK_APP(app);
+}
+
+static Boolean IsInArray(
+    String str,
+    String *sarray)
+{
+    if (str == NULL || sarray == NULL)
+       return False;
+    for (; *sarray; sarray++) {
+       if (strcmp(*sarray, str) == 0)
+           return True;
+    }
+    return False;
+}
+
+static String* EditCommand(
+    String str,                /* if not NULL, the sm_client_id */
+    String *src1,      /* first choice */
+    String *src2)      /* alternate */
+{
+    Boolean have;
+    Boolean want;
+    int count;
+    String *sarray;
+    String *s;
+    String *new;
+
+    want = (str != NULL);
+    sarray = (src1 ? src1 : src2);
+    if (! sarray) return NULL;
+    have = IsInArray("-xtsessionID", sarray);
+    if ((want && have) || (!want && !have)) {
+       if (sarray == src1)
+           return src1;
+       else
+           return NewStringArray(sarray);
+    }
+
+    count = 0;
+    for (s = sarray; *s; s++)
+       count++;
+
+    if (want) {
+       s = new = (String *) __XtMalloc((Cardinal)(count+3) * sizeof(String*));
+       *s = *sarray;           s++; sarray++;
+       *s = "-xtsessionID";    s++;
+       *s = str;               s++;
+       for (; --count > 0; s++, sarray++)
+           *s = *sarray;
+       *s = (String) NULL;
+    } else {
+       if (count < 3)
+           return NewStringArray(sarray);
+       s = new = (String *) __XtMalloc((Cardinal)(count-1) * sizeof(String*));
+       for (; --count >= 0; sarray++) {
+           if (strcmp(*sarray, "-xtsessionID") == 0) {
+               sarray++;
+               count--;
+           } else {
+               *s = *sarray;
+               s++;
+           }
+       }
+       *s = (String) NULL;
+    }
+    s = new;
+    new = NewStringArray(new);
+    XtFree((char *)s);
+    return new;
+}
+
+#endif /* !XT_NO_SM */
diff --git a/src/TMaction.c b/src/TMaction.c
new file mode 100644 (file)
index 0000000..7af75ad
--- /dev/null
@@ -0,0 +1,1067 @@
+/*LINTLIBRARY*/
+
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+/* TMaction.c -- maintains the state table of actions for the translation
+ *              manager.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+
+#if defined(__STDC__) && !defined(NORCONST)
+#define RConst const
+#else
+#define RConst /**/
+#endif
+
+static String XtNtranslationError = "translationError";
+
+typedef struct _CompiledAction{
+    XrmQuark           signature;
+    XtActionProc       proc;
+}CompiledAction, *CompiledActionTable;
+
+
+#define GetClassActions(wc) \
+  ((wc->core_class.actions) \
+? (((TMClassCache)wc->core_class.actions)->actions) \
+: NULL)
+
+static CompiledActionTable CompileActionTable(
+    register RConst struct _XtActionsRec *actions,
+    register Cardinal count,   /* may be 0 */
+    Boolean stat,      /* if False, copy before compiling in place */
+    Boolean perm)      /* if False, use XrmStringToQuark */
+{
+    register CompiledActionTable cActions;
+    register int i;
+    CompiledAction hold;
+    CompiledActionTable cTableHold;
+    XrmQuark (*func)(_Xconst char*);
+
+    if (!count)
+       return (CompiledActionTable) NULL;
+    func = (perm ? XrmPermStringToQuark : XrmStringToQuark);
+
+    if (! stat) {
+       cTableHold = cActions = (CompiledActionTable)
+           __XtMalloc(count * sizeof(CompiledAction));
+
+       for (i=count; --i >= 0; cActions++, actions++) {
+           cActions->proc = actions->proc;
+           cActions->signature = (*func)(actions->string);
+       }
+    } else {
+       cTableHold = (CompiledActionTable) actions;
+
+       for (i=count; --i >= 0; actions++)
+           ((CompiledActionTable) actions)->signature =
+               (*func)(actions->string);
+    }
+    cActions = cTableHold;
+
+    /* Insertion sort.  Whatever sort is used, it must be stable. */
+    for (i=1; (Cardinal) i <= count - 1; i++) {
+       register Cardinal j;
+       hold = cActions[i];
+       j = i;
+       while (j && cActions[j-1].signature > hold.signature) {
+           cActions[j] = cActions[j-1];
+           j--;
+       }
+       cActions[j] = hold;
+    }
+
+    return cActions;
+}
+
+
+typedef struct _ActionListRec *ActionList;
+typedef struct _ActionListRec {
+    ActionList         next;
+    CompiledActionTable table;
+    TMShortCard                count;
+} ActionListRec;
+
+static void ReportUnboundActions(
+    XtTranslations     xlations,
+    TMBindData         bindData)
+{
+    TMSimpleStateTree  stateTree = (TMSimpleStateTree)xlations->stateTreeTbl[0];
+    Cardinal num_unbound = 0;
+    Cardinal num_params = 1;
+    char* message;
+    char messagebuf[1000];
+    String params[1];
+    register Cardinal num_chars = 0;
+    register Cardinal i, j;
+    XtActionProc *procs;
+
+    for (i=0; i < xlations->numStateTrees; i++) {
+       if (bindData->simple.isComplex)
+         procs = TMGetComplexBindEntry(bindData, i)->procs;
+       else
+         procs = TMGetSimpleBindEntry(bindData, i)->procs;
+
+       stateTree = (TMSimpleStateTree)xlations->stateTreeTbl[i];
+       for (j=0; j < stateTree->numQuarks; j++) {
+           if (procs[j] == NULL) {
+               String s = XrmQuarkToString(stateTree->quarkTbl[j]);
+               if (num_unbound != 0)
+                   num_chars += 2;
+               num_chars += strlen(s);
+               num_unbound++;
+           }
+       }
+    }
+    if (num_unbound == 0)
+       return;
+    message = XtStackAlloc (num_chars + 1, messagebuf);
+    if (message != NULL) {
+       *message = '\0';
+       num_unbound = 0;
+       stateTree = (TMSimpleStateTree)xlations->stateTreeTbl[0];
+       for (i=0; i < xlations->numStateTrees; i++) {
+           if (bindData->simple.isComplex)
+               procs = TMGetComplexBindEntry(bindData, i)->procs;
+           else
+               procs = TMGetSimpleBindEntry(bindData, i)->procs;
+
+           stateTree = (TMSimpleStateTree)xlations->stateTreeTbl[i];
+           for (j=0; j < stateTree->numQuarks; j++) {
+               if (procs[j] == NULL) {
+                   String s = XrmQuarkToString(stateTree->quarkTbl[j]);
+                   if (num_unbound != 0)
+                       (void) strcat(message, ", ");
+                   (void) strcat(message, s);
+                   num_unbound++;
+               }
+           }
+       }
+       message[num_chars] = '\0';
+       params[0] = message;
+       XtWarningMsg(XtNtranslationError,"unboundActions",XtCXtToolkitError,
+                    "Actions not found: %s",
+                    params, &num_params);
+       XtStackFree (message, messagebuf);
+    }
+}
+
+
+static CompiledAction *SearchActionTable(
+    XrmQuark           signature,
+    CompiledActionTable        actionTable,
+    Cardinal           numActions)
+{
+    register int i, left, right;
+
+    left = 0;
+    right = numActions - 1;
+    while (left <= right) {
+       i = (left + right) >> 1;
+       if (signature < actionTable[i].signature)
+           right = i - 1;
+       else if (signature > actionTable[i].signature)
+           left = i + 1;
+       else {
+           while (i && actionTable[i - 1].signature == signature)
+               i--;
+           return &actionTable[i];
+       }
+    }
+    return (CompiledAction *) NULL;
+}
+
+static int BindActions(
+    TMSimpleStateTree  stateTree,
+    XtActionProc       *procs,
+    CompiledActionTable compiledActionTable,
+    TMShortCard                numActions,
+    Cardinal           *ndxP)
+{
+    register int unbound = stateTree->numQuarks - *ndxP;
+    CompiledAction* action;
+    register Cardinal ndx;
+    register Boolean savedNdx = False;
+
+    for (ndx = *ndxP; ndx < stateTree->numQuarks; ndx++) {
+       if (procs[ndx] == NULL) {
+           /* attempt to bind it */
+           XrmQuark q = stateTree->quarkTbl[ndx];
+
+           action = SearchActionTable(q, compiledActionTable, numActions);
+           if (action) {
+               procs[ndx] = action->proc;
+               unbound--;
+           } else if (!savedNdx) {
+               *ndxP= ndx;
+               savedNdx = True;
+           }
+       } else {
+           /* already bound, leave it alone */
+           unbound--;
+       }
+    }
+    return unbound;
+}
+
+typedef struct _TMBindCacheStatusRec{
+    unsigned int       boundInClass:1;
+    unsigned int       boundInHierarchy:1;
+    unsigned int       boundInContext:1;
+    unsigned int       notFullyBound:1;
+    unsigned int       refCount:28;
+}TMBindCacheStatusRec, *TMBindCacheStatus;
+
+typedef struct _TMBindCacheRec{
+    struct _TMBindCacheRec *next;
+    TMBindCacheStatusRec status;
+    TMStateTree                stateTree;
+#ifdef TRACE_TM
+    WidgetClass                widgetClass;
+#endif /* TRACE_TM */
+    XtActionProc       procs[1];       /* variable length */
+}TMBindCacheRec, *TMBindCache;
+
+typedef struct _TMClassCacheRec {
+    CompiledActionTable        actions;
+    TMBindCacheRec     *bindCache;
+}TMClassCacheRec, *TMClassCache;
+
+#define IsPureClassBind(bc) \
+  (bc->status.boundInClass && \
+   !(bc->status.boundInHierarchy || \
+     bc->status.boundInContext || \
+     bc->status.notFullyBound))
+
+#define GetClassCache(w) \
+  ((TMClassCache)w->core.widget_class->core_class.actions)
+
+
+static int  BindProcs(
+    Widget             widget,
+    TMSimpleStateTree  stateTree,
+    XtActionProc       *procs,
+    TMBindCacheStatus  bindStatus)
+{
+    register WidgetClass       class;
+    register ActionList        actionList;
+    int                        unbound = -1, newUnbound = -1;
+    Cardinal                   ndx = 0;
+    Widget                     w = widget;
+
+    LOCK_PROCESS;
+    do {
+        class = w->core.widget_class;
+        do {
+            if (class->core_class.actions != NULL)
+             unbound =
+               BindActions(stateTree,
+                           procs,
+                           GetClassActions(class),
+                           class->core_class.num_actions,
+                           &ndx);
+           class = class->core_class.superclass;
+        } while (unbound != 0 && class != NULL);
+       if (unbound < (int)stateTree->numQuarks)
+         bindStatus->boundInClass = True;
+       else
+         bindStatus->boundInClass = False;
+       if (newUnbound == -1)
+         newUnbound = unbound;
+       w = XtParent(w);
+    } while (unbound != 0 && w != NULL);
+
+    if (newUnbound > unbound)
+      bindStatus->boundInHierarchy = True;
+    else
+      bindStatus->boundInHierarchy = False;
+
+    if (unbound) {
+       XtAppContext app = XtWidgetToApplicationContext(widget);
+       newUnbound = unbound;
+       for (actionList = app->action_table;
+            unbound != 0 && actionList != NULL;
+            actionList = actionList->next) {
+           unbound = BindActions(stateTree,
+                                 procs,
+                                 actionList->table,
+                                 actionList->count,
+                                 &ndx);
+       }
+       if (newUnbound > unbound)
+         bindStatus->boundInContext = True;
+       else
+         bindStatus->boundInContext = False;
+
+    } else {
+       bindStatus->boundInContext = False;
+    }
+    UNLOCK_PROCESS;
+    return unbound;
+}
+
+static XtActionProc  *TryBindCache(
+    Widget     widget,
+    TMStateTree        stateTree)
+{
+    TMClassCache       classCache;
+
+    LOCK_PROCESS;
+    classCache = GetClassCache(widget);
+
+    if (classCache == NULL)
+      {
+         WidgetClass   wc = XtClass(widget);
+
+         wc->core_class.actions = (XtActionList)
+           _XtInitializeActionData(NULL, 0, True);
+      }
+    else
+      {
+         TMBindCache bindCache =
+           (TMBindCache)(classCache->bindCache);
+         for (; bindCache; bindCache = bindCache->next)
+           {
+               if (IsPureClassBind(bindCache) &&
+                   (stateTree == bindCache->stateTree))
+                 {
+                     bindCache->status.refCount++;
+                     UNLOCK_PROCESS;
+                     return &bindCache->procs[0];
+                 }
+           }
+      }
+    UNLOCK_PROCESS;
+    return NULL;
+}
+
+
+
+/*
+ * The class record actions field will point to the bind cache header
+ * after this call is made out of coreClassPartInit.
+ */
+XtPointer _XtInitializeActionData(
+    register struct _XtActionsRec      *actions,
+    register Cardinal                  count,
+    _XtBoolean                         inPlace)
+{
+    TMClassCache       classCache;
+
+    classCache = XtNew(TMClassCacheRec);
+    classCache->actions = CompileActionTable(actions, count, inPlace, True);
+    classCache->bindCache = NULL;
+    return (XtPointer)classCache;
+}
+
+
+#define TM_BIND_CACHE_REALLOC  2
+
+static XtActionProc *EnterBindCache(
+    Widget             w,
+    TMSimpleStateTree  stateTree,
+    XtActionProc       *procs,
+    TMBindCacheStatus  bindStatus)
+{
+    TMClassCache       classCache;
+    TMBindCache*       bindCachePtr;
+    TMShortCard                procsSize;
+    TMBindCache                bindCache;
+
+    LOCK_PROCESS;
+    classCache = GetClassCache(w);
+    bindCachePtr = &classCache->bindCache;
+    procsSize = stateTree->numQuarks * sizeof(XtActionProc);
+
+    for (bindCache = *bindCachePtr;
+        (*bindCachePtr);
+       bindCachePtr = &(*bindCachePtr)->next, bindCache = *bindCachePtr)
+      {
+         TMBindCacheStatus     cacheStatus = &bindCache->status;
+
+         if ((bindStatus->boundInClass == cacheStatus->boundInClass) &&
+             (bindStatus->boundInHierarchy == cacheStatus->boundInHierarchy) &&
+             (bindStatus->boundInContext == cacheStatus->boundInContext) &&
+             (bindCache->stateTree == (TMStateTree)stateTree) &&
+             !XtMemcmp(&bindCache->procs[0], procs, procsSize))
+           {
+               bindCache->status.refCount++;
+               break;
+           }
+      }
+    if (*bindCachePtr == NULL)
+      {
+         *bindCachePtr =
+           bindCache = (TMBindCache)
+             __XtMalloc(sizeof(TMBindCacheRec) +
+                      (procsSize - sizeof(XtActionProc)));
+         bindCache->next = NULL;
+         bindCache->status = *bindStatus;
+         bindCache->status.refCount = 1;
+         bindCache->stateTree = (TMStateTree)stateTree;
+#ifdef TRACE_TM
+         bindCache->widgetClass = XtClass(w);
+         if (_XtGlobalTM.numBindCache == _XtGlobalTM.bindCacheTblSize)
+           {
+               _XtGlobalTM.bindCacheTblSize += 16;
+               _XtGlobalTM.bindCacheTbl = (TMBindCache *)
+                 XtRealloc((char *)_XtGlobalTM.bindCacheTbl,
+                           ((_XtGlobalTM.bindCacheTblSize) *
+                            sizeof(TMBindCache)));
+           }
+         _XtGlobalTM.bindCacheTbl[_XtGlobalTM.numBindCache++] = bindCache;
+#endif /* TRACE_TM */
+         XtMemmove((XtPointer)&bindCache->procs[0],
+                   (XtPointer)procs, procsSize);
+      }
+    UNLOCK_PROCESS;
+    return &bindCache->procs[0];
+}
+
+static void RemoveFromBindCache(
+    Widget             w,
+    XtActionProc       *procs)
+{
+    TMClassCache       classCache;
+    TMBindCache*       bindCachePtr;
+    TMBindCache                bindCache;
+    XtAppContext       app = XtWidgetToApplicationContext (w);
+
+    LOCK_PROCESS;
+    classCache = GetClassCache(w);
+    bindCachePtr = (TMBindCache *)&classCache->bindCache;
+
+    for (bindCache = *bindCachePtr;
+        *bindCachePtr;
+        bindCachePtr = &(*bindCachePtr)->next, bindCache = *bindCachePtr)
+      {
+         if (&bindCache->procs[0] == procs)
+           {
+               if (--bindCache->status.refCount == 0)
+                 {
+#ifdef TRACE_TM
+                     TMShortCard       j;
+                     Boolean           found = False;
+                     TMBindCache       *tbl = _XtGlobalTM.bindCacheTbl;
+
+                     for (j = 0; j < _XtGlobalTM.numBindCache; j++) {
+                         if (found)
+                           tbl[j-1] = tbl[j];
+                         if (tbl[j] == bindCache)
+                           found = True;
+                     }
+                     if (!found)
+                       XtWarning("where's the action ??? ");
+                     else
+                       _XtGlobalTM.numBindCache--;
+#endif /* TRACE_TM */
+                     *bindCachePtr = bindCache->next;
+                     bindCache->next = app->free_bindings;
+                     app->free_bindings = bindCache;
+                 }
+               break;
+           }
+      }
+      UNLOCK_PROCESS;
+}
+
+/* ARGSUSED */
+static void RemoveAccelerators(
+    Widget widget,
+    XtPointer closure, XtPointer data)
+{
+    Widget             destination = (Widget)closure;
+    TMComplexBindProcs bindProcs;
+    XtTranslations     stackXlations[16];
+    XtTranslations     *xlationsList, destXlations;
+    TMShortCard                i, numXlations = 0;
+
+    if ((destXlations = destination->core.tm.translations) == NULL) {
+        XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+            XtNtranslationError,"nullTable",XtCXtToolkitError,
+            "Can't remove accelerators from NULL table",
+            (String *)NULL, (Cardinal *)NULL);
+        return;
+    }
+
+    xlationsList = (XtTranslations *)
+      XtStackAlloc((destXlations->numStateTrees * sizeof(XtTranslations)),
+                  stackXlations);
+
+    for (i = 0, bindProcs = TMGetComplexBindEntry(destination->core.tm.proc_table, i);
+        i < destXlations->numStateTrees;
+        i++, bindProcs++) {
+       if (bindProcs->widget == widget) {
+           /*
+            * if it's being destroyed don't do all the work
+            */
+           if (destination->core.being_destroyed) {
+               bindProcs->procs = NULL;
+           }
+           else
+             xlationsList[numXlations] = bindProcs->aXlations;
+           numXlations++;
+       }
+    }
+
+    if (numXlations == 0)
+      XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+                     XtNtranslationError,"nullTable",XtCXtToolkitError,
+                     "Tried to remove nonexistent accelerators",
+                     (String *)NULL, (Cardinal *)NULL);
+    else {
+       if (!destination->core.being_destroyed)
+         for (i = 0; i < numXlations; i++)
+           _XtUnmergeTranslations(destination, xlationsList[i]);
+    }
+    XtStackFree((char *)xlationsList, stackXlations);
+}
+
+void _XtBindActions(
+    Widget widget,
+    XtTM tm)
+{
+    XtTranslations             xlations = tm->translations;
+    TMSimpleStateTree          stateTree;
+    int                                globalUnbound = 0;
+    Cardinal                   i;
+    TMBindData                 bindData = (TMBindData)tm->proc_table;
+    TMSimpleBindProcs          simpleBindProcs = NULL;
+    TMComplexBindProcs                 complexBindProcs = NULL;
+    XtActionProc               *newProcs;
+    Widget                     bindWidget;
+
+    if ((xlations == NULL) || widget->core.being_destroyed)
+      return;
+
+    stateTree = (TMSimpleStateTree)xlations->stateTreeTbl[0];
+
+    for (i = 0; i < xlations->numStateTrees; i++)
+      {
+         stateTree = (TMSimpleStateTree)xlations->stateTreeTbl[i];
+         if (bindData->simple.isComplex) {
+             complexBindProcs = TMGetComplexBindEntry(bindData, i);
+             if (complexBindProcs->widget) {
+                 bindWidget = complexBindProcs->widget;
+
+                 if (bindWidget->core.destroy_callbacks != NULL)
+                     _XtAddCallbackOnce((InternalCallbackList *)
+                                        &bindWidget->core.destroy_callbacks,
+                                        RemoveAccelerators,
+                                        (XtPointer)widget);
+                 else
+                     _XtAddCallback((InternalCallbackList *)
+                                    &bindWidget->core.destroy_callbacks,
+                                    RemoveAccelerators,
+                                    (XtPointer)widget);
+             }
+             else
+               bindWidget = widget;
+         }
+         else {
+             simpleBindProcs = TMGetSimpleBindEntry(bindData, i);
+             bindWidget = widget;
+         }
+         if ((newProcs =
+              TryBindCache(bindWidget,(TMStateTree)stateTree)) == NULL)
+           {
+               XtActionProc            *procs, stackProcs[256];
+               int                     localUnbound;
+               TMBindCacheStatusRec    bcStatusRec;
+
+               procs = (XtActionProc *)
+                 XtStackAlloc(stateTree->numQuarks * sizeof(XtActionProc),
+                              stackProcs);
+               XtBZero((XtPointer)procs,
+                       stateTree->numQuarks * sizeof(XtActionProc));
+
+               localUnbound = BindProcs(bindWidget,
+                                        stateTree,
+                                        procs,
+                                        &bcStatusRec);
+
+               if (localUnbound)
+                 bcStatusRec.notFullyBound = True;
+               else
+                 bcStatusRec.notFullyBound = False;
+
+               newProcs =
+                 EnterBindCache(bindWidget,
+                                stateTree,
+                                procs,
+                                &bcStatusRec);
+               XtStackFree((XtPointer)procs, (XtPointer)stackProcs);
+               globalUnbound += localUnbound;
+           }
+         if (bindData->simple.isComplex)
+           complexBindProcs->procs = newProcs;
+         else
+           simpleBindProcs->procs = newProcs;
+      }
+    if (globalUnbound)
+      ReportUnboundActions(xlations,
+                          (TMBindData)tm->proc_table);
+}
+
+
+void _XtUnbindActions(
+    Widget     widget,
+    XtTranslations xlations,
+    TMBindData bindData)
+{
+    Cardinal                   i;
+    Widget                     bindWidget;
+    XtActionProc               *procs;
+
+    if ((xlations == NULL) || !XtIsRealized(widget)) return;
+
+    for (i = 0; i < xlations->numStateTrees; i++) {
+       if (bindData->simple.isComplex) {
+           TMComplexBindProcs  complexBindProcs;
+
+           complexBindProcs = TMGetComplexBindEntry(bindData, i);
+
+           if (complexBindProcs->widget) {
+               /*
+                * check for this being an accelerator binding whose
+                * source is gone ( set by RemoveAccelerators)
+                */
+               if (complexBindProcs->procs == NULL)
+                 continue;
+
+               XtRemoveCallback(complexBindProcs->widget,
+                                XtNdestroyCallback,
+                                RemoveAccelerators,
+                                (XtPointer)widget);
+               bindWidget = complexBindProcs->widget;
+           }
+           else
+             bindWidget = widget;
+           procs = complexBindProcs->procs;
+           complexBindProcs->procs = NULL;
+       }
+       else {
+           TMSimpleBindProcs simpleBindProcs;
+           simpleBindProcs = TMGetSimpleBindEntry(bindData,i);
+           procs = simpleBindProcs->procs;
+           simpleBindProcs->procs = NULL;
+           bindWidget = widget;
+       }
+       RemoveFromBindCache(bindWidget, procs);
+      }
+}
+
+#ifdef notdef
+void _XtRemoveBindProcsByIndex(
+    Widget     w,
+    TMBindData bindData,
+    TMShortCard        ndx)
+{
+    TMShortCard        i = ndx;
+    TMBindProcs        bindProcs = (TMBindProcs)&bindData->bindTbl[0];
+
+    RemoveFromBindCache(bindProcs->widget ? bindProcs->widget : w,
+                       bindProcs[i].procs);
+
+    for (; i < bindData->bindTblSize; i++)
+      bindProcs[i] = bindProcs[i+1];
+}
+#endif /* notdef */
+
+/*
+ * used to free all copied action tables, called from DestroyAppContext
+ */
+void _XtFreeActions(
+    ActionList actions)
+{
+    ActionList curr, next;
+
+    for (curr = actions; curr;) {
+       next = curr->next;
+       XtFree((char *)curr->table);
+       XtFree((char *)curr);
+       curr = next;
+    }
+}
+
+void XtAddActions(
+    XtActionList actions,
+    Cardinal num_actions)
+{
+    XtAppAddActions(_XtDefaultAppContext(), actions, num_actions);
+}
+
+void XtAppAddActions(
+    XtAppContext app,
+    XtActionList actions,
+    Cardinal num_actions)
+{
+    register ActionList rec;
+
+    LOCK_APP(app);
+    rec = XtNew(ActionListRec);
+    rec->next = app->action_table;
+    app->action_table = rec;
+    rec->table = CompileActionTable(actions, num_actions, False, False);
+    rec->count = num_actions;
+    UNLOCK_APP(app);
+}
+
+void XtGetActionList(
+    WidgetClass widget_class,
+    XtActionList* actions_return,
+    Cardinal* num_actions_return)
+{
+    XtActionList list;
+    CompiledActionTable table;
+    int i;
+
+    *actions_return = NULL;
+    *num_actions_return = 0;
+
+    LOCK_PROCESS;
+    if (! widget_class->core_class.class_inited) {
+       UNLOCK_PROCESS;
+       return;
+    }
+    if (! (widget_class->core_class.class_inited & WidgetClassFlag)) {
+       UNLOCK_PROCESS;
+       return;
+    }
+    *num_actions_return = widget_class->core_class.num_actions;
+    if (*num_actions_return) {
+       list = *actions_return = (XtActionList)
+           __XtMalloc(*num_actions_return * sizeof(XtActionsRec));
+       table = GetClassActions(widget_class);
+       if (table != NULL) {
+           for (i= (*num_actions_return); --i >= 0; list++, table++) {
+               list->string = XrmQuarkToString(table->signature);
+               list->proc = table->proc;
+           }
+       }
+    }
+    UNLOCK_PROCESS;
+}
+
+/***********************************************************************
+ *
+ * Pop-up and Grab stuff
+ *
+ ***********************************************************************/
+
+static Widget _XtFindPopup(
+    Widget widget,
+    String name)
+{
+    register Cardinal i;
+    register XrmQuark q;
+    register Widget w;
+
+    q = XrmStringToQuark(name);
+
+    for (w=widget; w != NULL; w=w->core.parent)
+       for (i=0; i<w->core.num_popups; i++)
+           if (w->core.popup_list[i]->core.xrm_name == q)
+               return w->core.popup_list[i];
+
+    return NULL;
+}
+
+void XtMenuPopupAction(
+    Widget widget,
+    XEvent *event,
+    String *params,
+    Cardinal *num_params)
+{
+    Boolean spring_loaded;
+    register Widget popup_shell;
+    XtAppContext app = XtWidgetToApplicationContext(widget);
+
+    LOCK_APP(app);
+    if (*num_params != 1) {
+       XtAppWarningMsg(app,
+                     "invalidParameters","xtMenuPopupAction",XtCXtToolkitError,
+                       "MenuPopup wants exactly one argument",
+                       (String *)NULL, (Cardinal *)NULL);
+       UNLOCK_APP(app);
+       return;
+    }
+
+    if (event->type == ButtonPress)
+       spring_loaded = True;
+    else if (event->type == KeyPress || event->type == EnterNotify)
+       spring_loaded = False;
+    else {
+       XtAppWarningMsg(app,
+               "invalidPopup","unsupportedOperation",XtCXtToolkitError,
+"Pop-up menu creation is only supported on ButtonPress, KeyPress or EnterNotify events.",
+                  (String *)NULL, (Cardinal *)NULL);
+       UNLOCK_APP(app);
+       return;
+    }
+
+    popup_shell = _XtFindPopup(widget, params[0]);
+    if (popup_shell == NULL) {
+       XtAppWarningMsg(app,
+                       "invalidPopup","xtMenuPopup",XtCXtToolkitError,
+                       "Can't find popup widget \"%s\" in XtMenuPopup",
+                       params, num_params);
+       UNLOCK_APP(app);
+       return;
+    }
+
+    if (spring_loaded) _XtPopup(popup_shell, XtGrabExclusive, TRUE);
+    else _XtPopup(popup_shell, XtGrabNonexclusive, FALSE);
+    UNLOCK_APP(app);
+}
+
+
+/*ARGSUSED*/
+static void _XtMenuPopdownAction(
+    Widget widget,
+    XEvent *event,
+    String *params,
+    Cardinal *num_params)
+{
+    Widget popup_shell;
+
+    if (*num_params == 0) {
+       XtPopdown(widget);
+    } else if (*num_params == 1) {
+       popup_shell = _XtFindPopup(widget, params[0]);
+       if (popup_shell == NULL) {
+            XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+                           "invalidPopup","xtMenuPopdown",XtCXtToolkitError,
+                           "Can't find popup widget \"%s\" in XtMenuPopdown",
+                           params, num_params);
+           return;
+       }
+       XtPopdown(popup_shell);
+    } else {
+       XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+                       "invalidParameters","xtMenuPopdown",XtCXtToolkitError,
+                       "XtMenuPopdown called with num_params != 0 or 1",
+                       (String *)NULL, (Cardinal *)NULL);
+    }
+}
+
+static XtActionsRec RConst tmActions[] = {
+    {"XtMenuPopup", XtMenuPopupAction},
+    {"XtMenuPopdown", _XtMenuPopdownAction},
+    {"MenuPopup", XtMenuPopupAction}, /* old & obsolete */
+    {"MenuPopdown", _XtMenuPopdownAction}, /* ditto */
+#ifndef NO_MIT_HACKS
+    {"XtDisplayTranslations", _XtDisplayTranslations},
+    {"XtDisplayAccelerators", _XtDisplayAccelerators},
+    {"XtDisplayInstalledAccelerators", _XtDisplayInstalledAccelerators},
+#endif
+};
+
+
+void _XtPopupInitialize(
+    XtAppContext app)
+{
+    register ActionList rec;
+
+    /*
+     * The _XtGlobalTM.newMatchSemantics flag determines whether
+     * we support old or new matching
+     * behavior. This is mainly an issue of whether subsequent lhs will
+     * get pushed up in the match table if a lhs containing thier initial
+     * sequence has already been encountered. Currently inited to False;
+     */
+#ifdef NEW_TM
+    _XtGlobalTM.newMatchSemantics = True;
+#else
+    _XtGlobalTM.newMatchSemantics = False;
+#endif
+
+    rec = XtNew(ActionListRec);
+    rec->next = app->action_table;
+    app->action_table = rec;
+    LOCK_PROCESS;
+    rec->table = CompileActionTable(tmActions, XtNumber(tmActions), False,
+                                   True);
+    rec->count = XtNumber(tmActions);
+    UNLOCK_PROCESS;
+    _XtGrabInitialize(app);
+}
+
+
+void XtCallActionProc(
+    Widget widget,
+    _Xconst char* action,
+    XEvent *event,
+    String *params,
+    Cardinal num_params)
+{
+    CompiledAction* actionP;
+    XrmQuark q = XrmStringToQuark(action);
+    Widget w = widget;
+    XtAppContext app = XtWidgetToApplicationContext(widget);
+    ActionList actionList;
+    Cardinal i;
+
+    LOCK_APP(app);
+    XtCheckSubclass(widget, coreWidgetClass,
+                   "XtCallActionProc first argument is not a subclass of Core");
+    LOCK_PROCESS;
+    do {
+       WidgetClass class = XtClass(w);
+       do {
+           if ((actionP = GetClassActions(class)) != NULL)
+             for (i = 0;
+                  i < class->core_class.num_actions;
+                  i++, actionP++) {
+
+                 if (actionP->signature == q) {
+                     ActionHook hook = app->action_hook_list;
+                     while (hook != NULL) {
+                         (*hook->proc)( widget,
+                                       hook->closure,
+                                       (String)action,
+                                       event,
+                                       params,
+                                       &num_params
+                                       );
+                         hook= hook->next;
+                     }
+                     (*(actionP->proc))
+                       (widget, event, params, &num_params);
+                     UNLOCK_PROCESS;
+                     UNLOCK_APP(app);
+                     return;
+                 }
+             }
+           class = class->core_class.superclass;
+       } while (class != NULL);
+       w = XtParent(w);
+    } while (w != NULL);
+    UNLOCK_PROCESS;
+
+    for (actionList = app->action_table;
+        actionList != NULL;
+        actionList = actionList->next) {
+
+       for (i = 0, actionP = actionList->table;
+            i < actionList->count;
+            i++, actionP++) {
+           if (actionP->signature == q) {
+               ActionHook hook = app->action_hook_list;
+               while (hook != NULL) {
+                   (*hook->proc)( widget,
+                                 hook->closure,
+                                 (String)action,
+                                 event,
+                                 params,
+                                 &num_params
+                                 );
+                   hook= hook->next;
+               }
+               (*(actionP->proc))
+                 (widget, event, params, &num_params);
+               UNLOCK_APP(app);
+               return;
+           }
+       }
+
+    }
+
+    {
+       String params[2];
+       Cardinal num_params = 2;
+       params[0] = (String)action;
+       params[1] = XtName(widget);
+       XtAppWarningMsg(app,
+                       "noActionProc", "xtCallActionProc", XtCXtToolkitError,
+                       "No action proc named \"%s\" is registered for widget \"%s\"",
+                       params, &num_params
+                       );
+    }
+    UNLOCK_APP(app);
+}
+
+void _XtDoFreeBindings(
+    XtAppContext app)
+{
+    TMBindCache bcp;
+
+    while (app->free_bindings) {
+       bcp = app->free_bindings->next;
+       XtFree ((char *) app->free_bindings);
+       app->free_bindings = bcp;
+    }
+}
diff --git a/src/TMgrab.c b/src/TMgrab.c
new file mode 100644 (file)
index 0000000..08cb486
--- /dev/null
@@ -0,0 +1,344 @@
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+/*LINTLIBRARY*/
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+
+typedef struct _GrabActionRec {
+    struct _GrabActionRec* next;
+    XtActionProc action_proc;
+    Boolean owner_events;
+    unsigned int event_mask;
+    int pointer_mode, keyboard_mode;
+} GrabActionRec;
+
+static GrabActionRec *grabActionList = NULL;
+
+static void GrabAllCorrectKeys(
+    Widget widget,
+    TMTypeMatch typeMatch,
+    TMModifierMatch modMatch,
+    GrabActionRec* grabP)
+{
+    Display *dpy = XtDisplay(widget);
+    KeyCode *keycodes, *keycodeP;
+    Cardinal keycount;
+    Modifiers careOn = 0;
+    Modifiers careMask = 0;
+
+    if (modMatch->lateModifiers) {
+       Boolean resolved;
+       resolved = _XtComputeLateBindings(dpy, modMatch->lateModifiers,
+                                         &careOn, &careMask);
+       if (!resolved) return;
+    }
+    careOn |= modMatch->modifiers;
+    careMask |= modMatch->modifierMask;
+
+    XtKeysymToKeycodeList(
+           dpy,
+           (KeySym)typeMatch->eventCode,
+           &keycodes,
+           &keycount
+                        );
+    if (keycount == 0) return;
+    for (keycodeP = keycodes; keycount--; keycodeP++) {
+       if (modMatch->standard) {
+           /* find standard modifiers that produce this keysym */
+           KeySym keysym;
+           int std_mods, least_mod;
+           Modifiers modifiers_return;
+           XtTranslateKeycode( dpy, *keycodeP, (Modifiers)0,
+                               &modifiers_return, &keysym );
+           if (careOn & modifiers_return)
+               return;
+           if (keysym == typeMatch->eventCode) {
+               XtGrabKey(widget, *keycodeP, careOn,
+                         grabP->owner_events,
+                         grabP->pointer_mode,
+                         grabP->keyboard_mode
+                       );
+               /* continue; */         /* grab all modifier combinations */
+           }
+           least_mod = modifiers_return & (~modifiers_return + 1);
+           for (std_mods = modifiers_return;
+                std_mods >= least_mod; std_mods--) {
+               Modifiers dummy;
+                /* check all useful combinations of modifier bits */
+               if (modifiers_return & std_mods &&
+                   !(~modifiers_return & std_mods)) {
+                   XtTranslateKeycode( dpy, *keycodeP,
+                                       (Modifiers)std_mods,
+                                       &dummy, &keysym );
+                   if (keysym == typeMatch->eventCode) {
+                       XtGrabKey(widget, *keycodeP,
+                                 careOn | (Modifiers) std_mods,
+                                 grabP->owner_events,
+                                 grabP->pointer_mode,
+                                 grabP->keyboard_mode
+                               );
+                       /* break; */    /* grab all modifier combinations */
+                   }
+               }
+           }
+       } else /* !event->standard */ {
+           XtGrabKey(widget, *keycodeP, careOn,
+                     grabP->owner_events,
+                     grabP->pointer_mode,
+                     grabP->keyboard_mode
+                   );
+       }
+    }
+    XtFree((char *)keycodes);
+}
+
+typedef struct {
+    TMShortCard count;
+    Widget     widget;
+    GrabActionRec *grabP;
+}DoGrabRec;
+
+static Boolean DoGrab(
+    StatePtr           state,
+    XtPointer          data)
+{
+    DoGrabRec          *doGrabP = (DoGrabRec *)data;
+    GrabActionRec*     grabP = doGrabP->grabP;
+    Widget             widget = doGrabP->widget;
+    TMShortCard                count = doGrabP->count;
+    TMShortCard                typeIndex = state->typeIndex;
+    TMShortCard                modIndex = state->modIndex;
+    ActionRec          *action;
+    TMTypeMatch                typeMatch;
+    TMModifierMatch    modMatch;
+    Modifiers          careOn = 0;
+    Modifiers          careMask = 0;
+    Boolean            resolved;
+
+    LOCK_PROCESS;
+    typeMatch = TMGetTypeMatch(typeIndex);
+    modMatch = TMGetModifierMatch(modIndex);
+
+    for (action = state->actions; action; action = action->next)
+      if (count == action->idx) break;
+    if (!action) {
+       UNLOCK_PROCESS;
+       return False;
+    }
+
+    switch (typeMatch->eventType) {
+      case ButtonPress:
+      case ButtonRelease:
+       if (modMatch->lateModifiers) {
+           resolved = _XtComputeLateBindings(XtDisplay(widget),
+                                             modMatch->lateModifiers,
+                                             &careOn, &careMask);
+           if (!resolved) break;
+       }
+       careOn |= modMatch->modifiers;
+       XtGrabButton(
+                    widget,
+                    (unsigned) typeMatch->eventCode,
+                    careOn,
+                    grabP->owner_events,
+                    grabP->event_mask,
+                    grabP->pointer_mode,
+                    grabP->keyboard_mode,
+                    None,
+                    None
+                    );
+       break;
+
+      case KeyPress:
+      case KeyRelease:
+       GrabAllCorrectKeys(widget, typeMatch, modMatch, grabP);
+       break;
+
+      case EnterNotify:
+       break;
+
+      default:
+       XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+                       "invalidPopup","unsupportedOperation",XtCXtToolkitError,
+                       "Pop-up menu creation is only supported on Button, Key or EnterNotify events.",
+                       (String *)NULL, (Cardinal *)NULL);
+       break;
+    }
+    UNLOCK_PROCESS;
+    return False;
+}
+
+void _XtRegisterGrabs(
+    Widget widget)
+{
+    XtTranslations     xlations = widget->core.tm.translations;
+    TMComplexStateTree         *stateTreePtr;
+    unsigned int       count;
+    TMShortCard                i;
+    TMBindData         bindData = (TMBindData) widget->core.tm.proc_table;
+    XtActionProc       *procs;
+
+    if (! XtIsRealized(widget) || widget->core.being_destroyed)
+       return;
+
+    /* walk the widget instance action bindings table looking for */
+    /* actions registered as grab actions. */
+    /* when you find one, do a grab on the triggering event */
+
+    if (xlations == NULL) return;
+    stateTreePtr = (TMComplexStateTree *) xlations->stateTreeTbl;
+    if (*stateTreePtr == NULL) return;
+    for (i = 0; i < xlations->numStateTrees; i++, stateTreePtr++) {
+       if (bindData->simple.isComplex)
+         procs = TMGetComplexBindEntry(bindData, i)->procs;
+       else
+         procs = TMGetSimpleBindEntry(bindData, i)->procs;
+       for (count=0; count < (*stateTreePtr)->numQuarks; count++) {
+           GrabActionRec* grabP;
+           DoGrabRec      doGrab;
+
+           LOCK_PROCESS;
+           for (grabP = grabActionList; grabP != NULL; grabP = grabP->next) {
+               if (grabP->action_proc == procs[count]) {
+                   /* we've found a "grabber" in the action table. Find the
+                    * states that call this action.  Note that if there is
+                    * more than one "grabber" in the action table, we end
+                    * up searching all of the states multiple times.
+                    */
+                   doGrab.widget = widget;
+                   doGrab.grabP = grabP;
+                   doGrab.count = count;
+                   _XtTraverseStateTree((TMStateTree)*stateTreePtr,
+                                        DoGrab,
+                                        (XtPointer)&doGrab);
+               }
+           }
+           UNLOCK_PROCESS;
+       }
+    }
+}
+
+void XtRegisterGrabAction(
+    XtActionProc action_proc,
+    _XtBoolean owner_events,
+    unsigned int event_mask,
+    int pointer_mode,
+    int keyboard_mode)
+{
+    GrabActionRec* actionP;
+
+    LOCK_PROCESS;
+    for (actionP = grabActionList; actionP != NULL; actionP = actionP->next) {
+       if (actionP->action_proc == action_proc) break;
+    }
+    if (actionP == NULL) {
+       actionP = XtNew(GrabActionRec);
+       actionP->action_proc = action_proc;
+       actionP->next = grabActionList;
+       grabActionList = actionP;
+    }
+#ifdef DEBUG
+    else
+       if (   actionP->owner_events != owner_events
+           || actionP->event_mask != event_mask
+           || actionP->pointer_mode != pointer_mode
+           || actionP->keyboard_mode != keyboard_mode) {
+           Cardinal n = 0;
+           XtWarningMsg(
+               "argsReplaced", "xtRegisterGrabAction", XtCXtToolkitError,
+               "XtRegisterGrabAction called on same proc with different args",
+                        NULL, &n);
+       }
+#endif /*DEBUG*/
+
+    actionP->owner_events = owner_events;
+    actionP->event_mask = event_mask;
+    actionP->pointer_mode = pointer_mode;
+    actionP->keyboard_mode = keyboard_mode;
+    UNLOCK_PROCESS;
+}
+
+/*ARGSUSED*/
+void _XtGrabInitialize(
+    XtAppContext       app)
+{
+    LOCK_PROCESS;
+    if (grabActionList == NULL)
+       XtRegisterGrabAction( XtMenuPopupAction, True,
+                             (unsigned)(ButtonPressMask | ButtonReleaseMask),
+                             GrabModeAsync,
+                             GrabModeAsync
+                           );
+    UNLOCK_PROCESS;
+
+}
diff --git a/src/TMkey.c b/src/TMkey.c
new file mode 100644 (file)
index 0000000..e59bcca
--- /dev/null
@@ -0,0 +1,727 @@
+/*LINTLIBRARY*/
+
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#define XK_MISCELLANY
+#define XK_LATIN1
+#define XK_LATIN2
+#define XK_LATIN3
+#define XK_LATIN4
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include <X11/keysymdef.h>
+#ifdef XKB
+#include <X11/XKBlib.h>
+#endif
+
+#define FLUSHKEYCACHE(ctx) \
+       bzero((char *)&ctx->keycache, sizeof(TMKeyCache))
+
+/*
+ * The following array reorders the modifier bits so that the most common ones
+ * (used by a translator) are in the top-most bits with respect to the size of
+ * the keycache.  The array currently just reverses the bits as a good guess.
+ * This might be more trouble than it is worth, but it seems to help.
+ */
+
+#define FM(i) i >> (8 - TMKEYCACHELOG2)
+static const unsigned char modmix[256] = {
+FM(0x0f), FM(0x8f), FM(0x4f), FM(0xcf), FM(0x2f), FM(0xaf), FM(0x6f), FM(0xef),
+FM(0x1f), FM(0x9f), FM(0x5f), FM(0xdf), FM(0x3f), FM(0xbf), FM(0x7f), FM(0xff),
+FM(0x07), FM(0x87), FM(0x47), FM(0xc7), FM(0x27), FM(0xa7), FM(0x67), FM(0xe7),
+FM(0x17), FM(0x97), FM(0x57), FM(0xd7), FM(0x37), FM(0xb7), FM(0x77), FM(0xf7),
+FM(0x0b), FM(0x8b), FM(0x4b), FM(0xcb), FM(0x2b), FM(0xab), FM(0x6b), FM(0xeb),
+FM(0x1b), FM(0x9b), FM(0x5b), FM(0xdb), FM(0x3b), FM(0xbb), FM(0x7b), FM(0xfb),
+FM(0x03), FM(0x83), FM(0x43), FM(0xc3), FM(0x23), FM(0xa3), FM(0x63), FM(0xe3),
+FM(0x13), FM(0x93), FM(0x53), FM(0xd3), FM(0x33), FM(0xb3), FM(0x73), FM(0xf3),
+FM(0x0d), FM(0x8d), FM(0x4d), FM(0xcd), FM(0x2d), FM(0xad), FM(0x6d), FM(0xed),
+FM(0x1d), FM(0x9d), FM(0x5d), FM(0xdd), FM(0x3d), FM(0xbd), FM(0x7d), FM(0xfd),
+FM(0x05), FM(0x85), FM(0x45), FM(0xc5), FM(0x25), FM(0xa5), FM(0x65), FM(0xe5),
+FM(0x15), FM(0x95), FM(0x55), FM(0xd5), FM(0x35), FM(0xb5), FM(0x75), FM(0xf5),
+FM(0x09), FM(0x89), FM(0x49), FM(0xc9), FM(0x29), FM(0xa9), FM(0x69), FM(0xe9),
+FM(0x19), FM(0x99), FM(0x59), FM(0xd9), FM(0x39), FM(0xb9), FM(0x79), FM(0xf9),
+FM(0x01), FM(0x81), FM(0x41), FM(0xc1), FM(0x21), FM(0xa1), FM(0x61), FM(0xe1),
+FM(0x11), FM(0x91), FM(0x51), FM(0xd1), FM(0x31), FM(0xb1), FM(0x71), FM(0xf1),
+FM(0x00), FM(0x8e), FM(0x4e), FM(0xce), FM(0x2e), FM(0xae), FM(0x6e), FM(0xee),
+FM(0x1e), FM(0x9e), FM(0x5e), FM(0xde), FM(0x3e), FM(0xbe), FM(0x7e), FM(0xfe),
+FM(0x08), FM(0x88), FM(0x48), FM(0xc8), FM(0x28), FM(0xa8), FM(0x68), FM(0xe8),
+FM(0x18), FM(0x98), FM(0x58), FM(0xd8), FM(0x38), FM(0xb8), FM(0x78), FM(0xf8),
+FM(0x04), FM(0x84), FM(0x44), FM(0xc4), FM(0x24), FM(0xa4), FM(0x64), FM(0xe4),
+FM(0x14), FM(0x94), FM(0x54), FM(0xd4), FM(0x34), FM(0xb4), FM(0x74), FM(0xf4),
+FM(0x0c), FM(0x8c), FM(0x4c), FM(0xcc), FM(0x2c), FM(0xac), FM(0x6c), FM(0xec),
+FM(0x1c), FM(0x9c), FM(0x5c), FM(0xdc), FM(0x3c), FM(0xbc), FM(0x7c), FM(0xfc),
+FM(0x02), FM(0x82), FM(0x42), FM(0xc2), FM(0x22), FM(0xa2), FM(0x62), FM(0xe2),
+FM(0x12), FM(0x92), FM(0x52), FM(0xd2), FM(0x32), FM(0xb2), FM(0x72), FM(0xf2),
+FM(0x0a), FM(0x8a), FM(0x4a), FM(0xca), FM(0x2a), FM(0xaa), FM(0x6a), FM(0xea),
+FM(0x1a), FM(0x9a), FM(0x5a), FM(0xda), FM(0x3a), FM(0xba), FM(0x7a), FM(0xfa),
+FM(0x06), FM(0x86), FM(0x46), FM(0xc6), FM(0x26), FM(0xa6), FM(0x66), FM(0xe6),
+FM(0x16), FM(0x96), FM(0x56), FM(0xd6), FM(0x36), FM(0xb6), FM(0x76), FM(0xf6),
+FM(0x0e), FM(0x8e), FM(0x4e), FM(0xce), FM(0x2e), FM(0xae), FM(0x6e), FM(0xee),
+FM(0x1e), FM(0x9e), FM(0x5e), FM(0xde), FM(0x3e), FM(0xbe), FM(0x7e), FM(0xfe)
+};
+#undef FM
+
+#define MOD_RETURN(ctx, key) (ctx)->keycache.modifiers_return[key]
+
+#define TRANSLATE(ctx,pd,dpy,key,mod,mod_ret,sym_ret) \
+{ \
+    int _i_ = (((key) - (pd)->min_keycode + modmix[(mod) & 0xff]) & \
+              (TMKEYCACHESIZE-1)); \
+    if ((key) == 0) { /* Xlib XIM composed input */ \
+       mod_ret = 0; \
+       sym_ret = 0; \
+    } else if (   /* not Xlib XIM composed input */ \
+       (ctx)->keycache.keycode[_i_] == (key) && \
+       (ctx)->keycache.modifiers[_i_] == (mod)) { \
+       mod_ret = MOD_RETURN(ctx, key); \
+       sym_ret = (ctx)->keycache.keysym[_i_]; \
+    } else { \
+       XtTranslateKeycode(dpy, key, mod, &mod_ret, &sym_ret); \
+       (ctx)->keycache.keycode[_i_] = key; \
+       (ctx)->keycache.modifiers[_i_] = (unsigned char)(mod); \
+       (ctx)->keycache.keysym[_i_] = sym_ret; \
+       MOD_RETURN(ctx, key) = (unsigned char)mod_ret; \
+    } \
+}
+
+#define UPDATE_CACHE(ctx, pd, key, mod, mod_ret, sym_ret) \
+{ \
+    int _i_ = (((key) - (pd)->min_keycode + modmix[(mod) & 0xff]) & \
+              (TMKEYCACHESIZE-1)); \
+    (ctx)->keycache.keycode[_i_] = key; \
+    (ctx)->keycache.modifiers[_i_] = (unsigned char)(mod); \
+    (ctx)->keycache.keysym[_i_] = sym_ret; \
+    MOD_RETURN(ctx, key) = (unsigned char)mod_ret; \
+}
+
+/* usual number of expected keycodes in XtKeysymToKeycodeList */
+#define KEYCODE_ARRAY_SIZE 10
+
+Boolean _XtComputeLateBindings(
+    Display *dpy,
+    LateBindingsPtr lateModifiers,
+    Modifiers *computed,
+    Modifiers *computedMask)
+{
+    int i,j,ref;
+    ModToKeysymTable* temp;
+    XtPerDisplay perDisplay;
+    Boolean found;
+    KeySym tempKeysym = NoSymbol;
+
+    perDisplay = _XtGetPerDisplay(dpy);
+    if (perDisplay == NULL) {
+        XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+               "displayError","invalidDisplay",XtCXtToolkitError,
+            "Can't find display structure",
+            (String *)NULL, (Cardinal *)NULL);
+         return FALSE;
+    }
+    _InitializeKeysymTables(dpy, perDisplay);
+    for (ref=0; lateModifiers[ref].keysym; ref++) {
+        found = FALSE;
+        for (i=0;i<8;i++) {
+            temp = &(perDisplay->modsToKeysyms[i]);
+            for (j=0;j<temp->count;j++){
+                if (perDisplay->modKeysyms[temp->idx+j] ==
+                   lateModifiers[ref].keysym) {
+                    *computedMask = *computedMask | temp->mask;
+                    if (!lateModifiers[ref].knot)
+                     *computed |= temp->mask;
+                    tempKeysym = lateModifiers[ref].keysym;
+                    found = TRUE; break;
+                }
+            }
+            if (found) break;
+        }
+        if (!found  && !lateModifiers[ref].knot)
+            if (!lateModifiers[ref].pair && (tempKeysym == NoSymbol))
+                return FALSE;
+        /* if you didn't find the modifier and the modifier must be
+           asserted then return FALSE. If you didn't find the modifier
+           and the modifier must be off, then it is OK . Don't
+           return FALSE if this is the first member of a pair or if
+           it is the second member of a pair when the first member
+           was bound to a modifier */
+    if (!lateModifiers[ref].pair) tempKeysym = NoSymbol;
+    }
+    return TRUE;
+}
+
+void _XtAllocTMContext(
+    XtPerDisplay pd)
+{
+    TMKeyContext ctx;
+    ctx = (TMKeyContext)_XtHeapAlloc(&pd->heap,
+                                    sizeof(TMKeyContextRec));
+    ctx->event = NULL;
+    ctx->serial = 0;
+    ctx->keysym = NoSymbol;
+    ctx->modifiers = 0;
+    FLUSHKEYCACHE(ctx);
+    pd->tm_context = ctx;
+}
+
+static unsigned int num_bits(unsigned long mask)
+{
+    register unsigned long y;
+
+    y = (mask >> 1) &033333333333;
+    y = mask - y - ((y >>1) & 033333333333);
+    return ((unsigned int) (((y + (y >> 3)) & 030707070707) % 077));
+}
+
+Boolean _XtMatchUsingDontCareMods(
+    TMTypeMatch        typeMatch,
+    TMModifierMatch    modMatch,
+    TMEventPtr                 eventSeq)
+{
+    Modifiers modifiers_return;
+    KeySym keysym_return;
+    Modifiers useful_mods;
+    int i, num_modbits;
+    Modifiers computed = 0;
+    Modifiers computedMask = 0;
+    Boolean resolved = TRUE;
+    Display *dpy = eventSeq->xev->xany.display;
+    XtPerDisplay pd;
+    TMKeyContext tm_context;
+
+    if (modMatch->lateModifiers != NULL)
+       resolved = _XtComputeLateBindings(dpy, modMatch->lateModifiers,
+                                         &computed, &computedMask);
+    if (!resolved) return FALSE;
+    computed |= modMatch->modifiers;
+    computedMask |= modMatch->modifierMask; /* gives do-care mask */
+
+    if ( (computed & computedMask) ==
+        (eventSeq->event.modifiers & computedMask) ) {
+
+       pd = _XtGetPerDisplay(dpy);
+       tm_context = pd->tm_context;
+       TRANSLATE(tm_context, pd, dpy, (KeyCode)eventSeq->event.eventCode,
+                           (unsigned)0, modifiers_return, keysym_return);
+
+        if ((keysym_return & typeMatch->eventCodeMask)  == typeMatch->eventCode ) {
+           tm_context->event = eventSeq->xev;
+           tm_context->serial = eventSeq->xev->xany.serial;
+           tm_context->keysym = keysym_return;
+           tm_context->modifiers = (Modifiers)0;
+           return TRUE;
+       }
+        useful_mods = ~computedMask & modifiers_return;
+        if (useful_mods == 0) return FALSE;
+
+       switch (num_modbits = num_bits(useful_mods)) {
+       case 1:
+       case 8:
+           /*
+            * one modbit should never happen, in fact the implementation
+            * of XtTranslateKey and XmTranslateKey guarantee that it
+            * won't, so don't care if the loop is set up for the case
+            * when one modbit is set.
+            * The performance implications of all eight modbits being
+            * set is horrendous. This isn't a problem with Xt/Xaw based
+            * applications. We can only hope that Motif's virtual
+            * modifiers won't result in all eight modbits being set.
+            */
+           for (i = useful_mods; i > 0; i--) {
+               TRANSLATE(tm_context, pd, dpy, eventSeq->event.eventCode,
+                         (Modifiers)i, modifiers_return, keysym_return);
+               if (keysym_return ==
+                   (typeMatch->eventCode & typeMatch->eventCodeMask)) {
+                   tm_context->event = eventSeq->xev;
+                   tm_context->serial = eventSeq->xev->xany.serial;
+                   tm_context->keysym = keysym_return;
+                   tm_context->modifiers = (Modifiers)i;
+                   return TRUE;
+               }
+           }
+           break;
+       default: /* (2..7) */
+           {
+           /*
+            * Only translate using combinations of the useful modifiers.
+            * to minimize the chance of invalidating the cache.
+            */
+               static char pows[] = { 0, 1, 3, 7, 15, 31, 63, 127 };
+               Modifiers tmod, mod_masks[8];
+               int j;
+               for (tmod = 1, i = 0; tmod <= (Mod5Mask<<1); tmod <<= 1)
+                   if (tmod & useful_mods) mod_masks[i++] = tmod;
+               for (j = (int) pows[num_modbits]; j > 0; j--) {
+                   tmod = 0;
+                   for (i = 0; i < num_modbits; i++)
+                       if (j & (1<<i)) tmod |= mod_masks[i];
+                   TRANSLATE(tm_context, pd, dpy, eventSeq->event.eventCode,
+                             tmod, modifiers_return, keysym_return);
+                   if (keysym_return ==
+                       (typeMatch->eventCode & typeMatch->eventCodeMask)) {
+                       tm_context->event = eventSeq->xev;
+                       tm_context->serial = eventSeq->xev->xany.serial;
+                       tm_context->keysym = keysym_return;
+                       tm_context->modifiers = (Modifiers)i;
+                       return TRUE;
+                   }
+               }
+           }
+           break;
+       } /* switch (num_modbits) */
+    }
+    return FALSE;
+}
+
+void XtConvertCase(
+    Display *dpy,
+    KeySym keysym,
+    KeySym *lower_return,
+    KeySym *upper_return)
+{
+    XtPerDisplay pd;
+    CaseConverterPtr ptr;
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    pd = _XtGetPerDisplay(dpy);
+
+    *lower_return = *upper_return = keysym;
+    for (ptr=pd->case_cvt;  ptr; ptr = ptr->next)
+       if (ptr->start <= keysym && keysym <= ptr->stop) {
+           (*ptr->proc)(dpy, keysym, lower_return, upper_return);
+           return;
+       }
+    XConvertCase(keysym, lower_return, upper_return);
+    UNLOCK_APP(app);
+}
+
+Boolean _XtMatchUsingStandardMods (
+    TMTypeMatch typeMatch,
+    TMModifierMatch modMatch,
+    TMEventPtr eventSeq)
+{
+    Modifiers modifiers_return;
+    KeySym keysym_return;
+    Modifiers computed= 0;
+    Modifiers computedMask = 0;
+    Boolean resolved = TRUE;
+    Display *dpy = eventSeq->xev->xany.display;
+    XtPerDisplay pd = _XtGetPerDisplay(dpy);
+    TMKeyContext tm_context = pd->tm_context;
+    Modifiers translateModifiers;
+
+    /* To maximize cache utilization, we mask off nonstandard modifiers
+       before cache lookup.  For a given key translator, standard modifiers
+       are constant per KeyCode.  If a key translator uses no standard
+       modifiers this implementation will never reference the cache.
+     */
+
+    modifiers_return = MOD_RETURN(tm_context, eventSeq->event.eventCode);
+    if (!modifiers_return) {
+       XtTranslateKeycode(dpy, (KeyCode)eventSeq->event.eventCode,
+                          eventSeq->event.modifiers, &modifiers_return,
+                          &keysym_return);
+       translateModifiers = eventSeq->event.modifiers & modifiers_return;
+       UPDATE_CACHE(tm_context, pd, eventSeq->event.eventCode,
+                    translateModifiers, modifiers_return, keysym_return);
+    } else {
+       translateModifiers = eventSeq->event.modifiers & modifiers_return;
+       TRANSLATE(tm_context, pd, dpy, (KeyCode)eventSeq->event.eventCode,
+                 translateModifiers, modifiers_return, keysym_return);
+    }
+
+    if ((typeMatch->eventCode & typeMatch->eventCodeMask) ==
+             (keysym_return & typeMatch->eventCodeMask)) {
+        if (modMatch->lateModifiers != NULL)
+            resolved = _XtComputeLateBindings(dpy, modMatch->lateModifiers,
+                                             &computed, &computedMask);
+        if (!resolved) return FALSE;
+        computed |= modMatch->modifiers;
+        computedMask |= modMatch->modifierMask;
+
+        if ((computed & computedMask) ==
+           (eventSeq->event.modifiers & ~modifiers_return & computedMask)) {
+           tm_context->event = eventSeq->xev;
+           tm_context->serial = eventSeq->xev->xany.serial;
+           tm_context->keysym = keysym_return;
+           tm_context->modifiers = translateModifiers;
+           return TRUE;
+       }
+    }
+    return FALSE;
+}
+
+
+void _XtBuildKeysymTables(
+    Display *dpy,
+    register XtPerDisplay pd)
+{
+    ModToKeysymTable *table;
+    int maxCount,i,j,k,tempCount,idx;
+    KeySym keysym,tempKeysym;
+    XModifierKeymap* modKeymap;
+    KeyCode keycode;
+#define KeysymTableSize 16
+
+    FLUSHKEYCACHE(pd->tm_context);
+    if (pd->keysyms)
+       XFree( (char *)pd->keysyms );
+    pd->keysyms_serial = NextRequest(dpy);
+    pd->keysyms = XGetKeyboardMapping(dpy, pd->min_keycode,
+                                     pd->max_keycode-pd->min_keycode+1,
+                                     &pd->keysyms_per_keycode);
+    if (pd->modKeysyms)
+       XtFree((char *)pd->modKeysyms);
+    if (pd->modsToKeysyms)
+       XtFree((char *)pd->modsToKeysyms);
+    pd->modKeysyms = (KeySym*)__XtMalloc((Cardinal)KeysymTableSize*sizeof(KeySym));
+    maxCount = KeysymTableSize;
+    tempCount = 0;
+
+    table = (ModToKeysymTable*)__XtMalloc((Cardinal)8*sizeof(ModToKeysymTable));
+    pd->modsToKeysyms = table;
+
+    table[0].mask = ShiftMask;
+    table[1].mask = LockMask;
+    table[2].mask = ControlMask;
+    table[3].mask = Mod1Mask;
+    table[4].mask = Mod2Mask;
+    table[5].mask = Mod3Mask;
+    table[6].mask = Mod4Mask;
+    table[7].mask = Mod5Mask;
+    tempKeysym = 0;
+
+    modKeymap = XGetModifierMapping(dpy);
+    for (i=0;i<32;i++)
+       pd->isModifier[i] = 0;
+    pd->mode_switch = 0;
+    pd->num_lock = 0;
+    for (i=0;i<8;i++) {
+        table[i].idx = tempCount;
+        table[i].count = 0;
+        for (j=0;j<modKeymap->max_keypermod;j++) {
+            keycode = modKeymap->modifiermap[i*modKeymap->max_keypermod+j];
+            if (keycode != 0) {
+               pd->isModifier[keycode>>3] |= 1 << (keycode & 7);
+                for (k=0; k<pd->keysyms_per_keycode;k++) {
+                    idx = ((keycode-pd->min_keycode)*
+                             pd->keysyms_per_keycode)+k;
+                    keysym = pd->keysyms[idx];
+                   if ((keysym == XK_Mode_switch) && (i > 2))
+                       pd->mode_switch |= 1 << i;
+                   if ((keysym == XK_Num_Lock) && (i > 2))
+                       pd->num_lock |= 1 << i;
+                    if (keysym != 0 && keysym != tempKeysym ){
+                        if (tempCount==maxCount) {
+                            maxCount += KeysymTableSize;
+                            pd->modKeysyms = (KeySym*)XtRealloc(
+                                (char*)pd->modKeysyms,
+                                (unsigned) (maxCount*sizeof(KeySym)) );
+                        }
+                        pd->modKeysyms[tempCount++] = keysym;
+                        table[i].count++;
+                        tempKeysym = keysym;
+                    }
+                }
+            }
+        }
+    }
+    pd->lock_meaning = NoSymbol;
+    for (i = 0; i < table[1].count; i++) {
+       keysym = pd->modKeysyms[table[1].idx + i];
+       if (keysym == XK_Caps_Lock) {
+           pd->lock_meaning = XK_Caps_Lock;
+           break;
+       } else if (keysym == XK_Shift_Lock) {
+           pd->lock_meaning = XK_Shift_Lock;
+       }
+    }
+    XFreeModifiermap(modKeymap);
+}
+
+void XtTranslateKeycode (
+    Display *dpy,
+    _XtKeyCode keycode,
+    Modifiers modifiers,
+    Modifiers *modifiers_return,
+    KeySym *keysym_return)
+{
+    XtPerDisplay pd;
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    pd = _XtGetPerDisplay(dpy);
+    _InitializeKeysymTables(dpy, pd);
+    (*pd->defaultKeycodeTranslator)(
+            dpy,keycode,modifiers,modifiers_return,keysym_return);
+    UNLOCK_APP(app);
+}
+
+/* This code should match XTranslateKey (internal, sigh) in Xlib */
+void XtTranslateKey(
+    register Display *dpy,
+    _XtKeyCode keycode,
+    Modifiers modifiers,
+    Modifiers *modifiers_return,
+    KeySym *keysym_return)
+{
+#ifndef XKB
+    XtPerDisplay pd;
+    int per;
+    register KeySym *syms;
+    KeySym sym, lsym, usym;
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    pd = _XtGetPerDisplay(dpy);
+    *modifiers_return = (ShiftMask|LockMask) | pd->mode_switch | pd->num_lock;
+    if (((int)keycode < pd->min_keycode) || ((int)keycode > pd->max_keycode)) {
+       *keysym_return = NoSymbol;
+       UNLOCK_APP(app);
+       return;
+    }
+    per = pd->keysyms_per_keycode;
+    syms = &pd->keysyms[(keycode - pd->min_keycode) * per];
+    while ((per > 2) && (syms[per - 1] == NoSymbol))
+       per--;
+    if ((per > 2) && (modifiers & pd->mode_switch)) {
+       syms += 2;
+       per -= 2;
+    }
+    if ((modifiers & pd->num_lock) &&
+       (per > 1 && (IsKeypadKey(syms[1]) || IsPrivateKeypadKey(syms[1])))) {
+       if ((modifiers & ShiftMask) ||
+           ((modifiers & LockMask) && (pd->lock_meaning == XK_Shift_Lock)))
+           *keysym_return = syms[0];
+       else
+           *keysym_return = syms[1];
+    } else if (!(modifiers & ShiftMask) &&
+       (!(modifiers & LockMask) || (pd->lock_meaning == NoSymbol))) {
+       if ((per == 1) || (syms[1] == NoSymbol))
+           XtConvertCase(dpy, syms[0], keysym_return, &usym);
+       else
+           *keysym_return = syms[0];
+    } else if (!(modifiers & LockMask) ||
+              (pd->lock_meaning != XK_Caps_Lock)) {
+       if ((per == 1) || ((usym = syms[1]) == NoSymbol))
+           XtConvertCase(dpy, syms[0], &lsym, &usym);
+       *keysym_return = usym;
+    } else {
+       if ((per == 1) || ((sym = syms[1]) == NoSymbol))
+           sym = syms[0];
+       XtConvertCase(dpy, sym, &lsym, &usym);
+       if (!(modifiers & ShiftMask) && (sym != syms[0]) &&
+           ((sym != usym) || (lsym == usym)))
+           XtConvertCase(dpy, syms[0], &lsym, &usym);
+       *keysym_return = usym;
+    }
+
+    if (*keysym_return == XK_VoidSymbol)
+       *keysym_return = NoSymbol;
+    UNLOCK_APP(app);
+#else
+    XkbLookupKeySym(dpy, keycode, modifiers, modifiers_return, keysym_return);
+#endif
+}
+
+void XtSetKeyTranslator(
+    Display *dpy,
+    XtKeyProc translator)
+{
+    XtPerDisplay pd;
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    pd = _XtGetPerDisplay(dpy);
+
+    pd->defaultKeycodeTranslator = translator;
+    FLUSHKEYCACHE(pd->tm_context);
+    /* XXX should now redo grabs */
+    UNLOCK_APP(app);
+}
+
+void XtRegisterCaseConverter(
+    Display *dpy,
+    XtCaseProc proc,
+    KeySym start,
+    KeySym stop)
+{
+    XtPerDisplay pd;
+    CaseConverterPtr ptr, prev;
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    pd = _XtGetPerDisplay(dpy);
+
+    ptr = (CaseConverterPtr) __XtMalloc(sizeof(CaseConverterRec));
+    ptr->start = start;
+    ptr->stop = stop;
+    ptr->proc = proc;
+    ptr->next = pd->case_cvt;
+    pd->case_cvt = ptr;
+
+    /* Remove obsolete case converters from the list */
+    prev = ptr;
+    for (ptr=ptr->next; ptr; ptr=prev->next) {
+       if (start <= ptr->start && stop >= ptr->stop) {
+           prev->next = ptr->next;
+           XtFree((char *)ptr);
+       }
+       else prev = ptr;
+    }
+    FLUSHKEYCACHE(pd->tm_context);
+    /* XXX should now redo grabs */
+    UNLOCK_APP(app);
+}
+
+KeySym *XtGetKeysymTable(
+    Display *dpy,
+    KeyCode *min_keycode_return,
+    int *keysyms_per_keycode_return)
+{
+    XtPerDisplay pd;
+    KeySym* retval;
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    pd = _XtGetPerDisplay(dpy);
+    _InitializeKeysymTables(dpy, pd);
+    *min_keycode_return = pd->min_keycode; /* %%% */
+    *keysyms_per_keycode_return = pd->keysyms_per_keycode;
+    retval = pd->keysyms;
+    UNLOCK_APP(app);
+    return retval;
+}
+
+void XtKeysymToKeycodeList(
+    Display *dpy,
+    KeySym keysym,
+    KeyCode **keycodes_return,
+    Cardinal *keycount_return)
+{
+    XtPerDisplay pd;
+    unsigned keycode;
+    int per, match;
+    register KeySym *syms;
+    register int i, j;
+    KeySym lsym, usym;
+    unsigned maxcodes = 0;
+    unsigned ncodes = 0;
+    KeyCode *keycodes, *codeP = NULL;
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    pd = _XtGetPerDisplay(dpy);
+    _InitializeKeysymTables(dpy, pd);
+    keycodes = NULL;
+    per = pd->keysyms_per_keycode;
+    for (syms = pd->keysyms, keycode = (unsigned) pd->min_keycode;
+        (int)keycode <= pd->max_keycode;
+        syms += per, keycode++) {
+       match = 0;
+       for (j = 0; j < per; j++) {
+           if (syms[j] == keysym) {
+               match = 1;
+               break;
+           }
+       }
+       if (!match)
+           for (i = 1; i < 5; i += 2) {
+               if ((per == i) || ((per > i) && (syms[i] == NoSymbol))) {
+                   XtConvertCase(dpy, syms[i-1], &lsym, &usym);
+                   if ((lsym == keysym) || (usym == keysym)) {
+                       match = 1;
+                       break;
+                   }
+               }
+           }
+       if (match) {
+           if (ncodes == maxcodes) {
+               KeyCode *old = keycodes;
+               maxcodes += KEYCODE_ARRAY_SIZE;
+               keycodes = (KeyCode*)__XtMalloc(maxcodes*sizeof(KeyCode));
+               if (ncodes) {
+                   (void) memmove((char *)keycodes, (char *)old,
+                                  ncodes*sizeof(KeyCode) );
+                   XtFree((char *)old);
+               }
+               codeP = &keycodes[ncodes];
+           }
+           *codeP++ = (KeyCode) keycode;
+           ncodes++;
+       }
+    }
+    *keycodes_return = keycodes;
+    *keycount_return = ncodes;
+    UNLOCK_APP(app);
+}
diff --git a/src/TMparse.c b/src/TMparse.c
new file mode 100644 (file)
index 0000000..d233644
--- /dev/null
@@ -0,0 +1,2144 @@
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+#include <ctype.h>
+#include <stdlib.h>
+#ifndef NOTASCII
+#define XK_LATIN1
+#endif
+#define XK_MISCELLANY
+#include <X11/keysymdef.h>
+
+#ifdef CACHE_TRANSLATIONS
+# ifdef REFCNT_TRANSLATIONS
+#  define CACHED XtCacheAll | XtCacheRefCount
+# else
+#  define CACHED XtCacheAll
+# endif
+#else
+# define CACHED XtCacheNone
+#endif
+
+#ifndef MAX
+#define MAX(a,b) (((a) > (b)) ? (a) : (b))
+#endif
+
+#ifndef MIN
+#define MIN(a,b) (((a) < (b)) ? (a) : (b))
+#endif
+
+static String XtNtranslationParseError = "translationParseError";
+
+typedef int            EventType;
+
+typedef String (*ParseProc)(
+    String /* str; */,
+    Opaque /* closure; */,
+    EventPtr /* event; */,
+    Boolean* /* error */);
+
+typedef TMShortCard    Value;
+typedef void (*ModifierProc)(Value, LateBindingsPtr*, Boolean, Value*);
+
+typedef struct _ModifierRec {
+    const char *name;
+    XrmQuark   signature;
+    ModifierProc modifierParseProc;
+    Value      value;
+} ModifierRec, *ModifierKeys;
+
+typedef struct _EventKey {
+    const char  *event;
+    XrmQuark   signature;
+    EventType  eventType;
+    ParseProc  parseDetail;
+    Opaque     closure;
+}EventKey, *EventKeys;
+
+typedef struct {
+    const char *name;
+    XrmQuark   signature;
+    Value      value;
+} NameValueRec, *NameValueTable;
+
+static void ParseModImmed(Value, LateBindingsPtr*, Boolean, Value*);
+static void ParseModSym(Value, LateBindingsPtr*, Boolean, Value*);
+static String PanicModeRecovery(String);
+static String CheckForPoundSign(String, _XtTranslateOp, _XtTranslateOp *);
+static KeySym StringToKeySym(String, Boolean *);
+static ModifierRec modifiers[] = {
+    {"Shift",  0,      ParseModImmed,ShiftMask},
+    {"Lock",   0,      ParseModImmed,LockMask},
+    {"Ctrl",   0,      ParseModImmed,ControlMask},
+    {"Mod1",   0,      ParseModImmed,Mod1Mask},
+    {"Mod2",   0,      ParseModImmed,Mod2Mask},
+    {"Mod3",   0,      ParseModImmed,Mod3Mask},
+    {"Mod4",   0,      ParseModImmed,Mod4Mask},
+    {"Mod5",   0,      ParseModImmed,Mod5Mask},
+    {"Meta",   0,      ParseModSym,  XK_Meta_L},
+    {"m",       0,      ParseModSym,  XK_Meta_L},
+    {"h",       0,      ParseModSym,  XK_Hyper_L},
+    {"su",      0,      ParseModSym,  XK_Super_L},
+    {"a",       0,      ParseModSym,  XK_Alt_L},
+    {"Hyper",   0,      ParseModSym,  XK_Hyper_L},
+    {"Super",   0,      ParseModSym,  XK_Super_L},
+    {"Alt",     0,      ParseModSym,  XK_Alt_L},
+    {"Button1",        0,      ParseModImmed,Button1Mask},
+    {"Button2",        0,      ParseModImmed,Button2Mask},
+    {"Button3",        0,      ParseModImmed,Button3Mask},
+    {"Button4",        0,      ParseModImmed,Button4Mask},
+    {"Button5",        0,      ParseModImmed,Button5Mask},
+    {"c",      0,      ParseModImmed,ControlMask},
+    {"s",      0,      ParseModImmed,ShiftMask},
+    {"l",      0,      ParseModImmed,LockMask},
+};
+
+static NameValueRec buttonNames[] = {
+    {"Button1",        0,      Button1},
+    {"Button2", 0,     Button2},
+    {"Button3", 0,     Button3},
+    {"Button4", 0,     Button4},
+    {"Button5", 0,     Button5},
+    {NULL, NULLQUARK, 0},
+};
+
+static NameValueRec motionDetails[] = {
+    {"Normal",         0,      NotifyNormal},
+    {"Hint",           0,      NotifyHint},
+    {NULL, NULLQUARK, 0},
+};
+
+static NameValueRec notifyModes[] = {
+    {"Normal",         0,      NotifyNormal},
+    {"Grab",           0,      NotifyGrab},
+    {"Ungrab",         0,      NotifyUngrab},
+    {"WhileGrabbed",    0,     NotifyWhileGrabbed},
+    {NULL, NULLQUARK, 0},
+};
+
+#if 0
+static NameValueRec notifyDetail[] = {
+    {"Ancestor",           0,  NotifyAncestor},
+    {"Virtual",                    0,  NotifyVirtual},
+    {"Inferior",           0,  NotifyInferior},
+    {"Nonlinear",          0,  NotifyNonlinear},
+    {"NonlinearVirtual",    0, NotifyNonlinearVirtual},
+    {"Pointer",                    0,  NotifyPointer},
+    {"PointerRoot",        0,  NotifyPointerRoot},
+    {"DetailNone",         0,  NotifyDetailNone},
+    {NULL, NULLQUARK, 0},
+};
+
+static NameValueRec visibilityNotify[] = {
+    {"Unobscured",         0,  VisibilityUnobscured},
+    {"PartiallyObscured",   0, VisibilityPartiallyObscured},
+    {"FullyObscured",       0, VisibilityFullyObscured},
+    {NULL, NULLQUARK, 0},
+};
+
+static NameValueRec circulation[] = {
+    {"OnTop",       0, PlaceOnTop},
+    {"OnBottom",    0, PlaceOnBottom},
+    {NULL, NULLQUARK, 0},
+};
+
+static NameValueRec propertyChanged[] = {
+    {"NewValue",    0, PropertyNewValue},
+    {"Delete",      0, PropertyDelete},
+    {NULL, NULLQUARK, 0},
+};
+#endif /*0*/
+
+static NameValueRec mappingNotify[] = {
+    {"Modifier",       0,      MappingModifier},
+    {"Keyboard",       0,      MappingKeyboard},
+    {"Pointer",        0,      MappingPointer},
+    {NULL, NULLQUARK, 0},
+};
+
+static String ParseKeySym(String, Opaque, EventPtr, Boolean*);
+static String ParseKeyAndModifiers(String, Opaque, EventPtr, Boolean*);
+static String ParseTable(String, Opaque, EventPtr, Boolean*);
+static String ParseImmed(String, Opaque, EventPtr, Boolean*);
+static String ParseAddModifier(String, Opaque, EventPtr, Boolean*);
+static String ParseNone(String, Opaque, EventPtr, Boolean*);
+static String ParseAtom(String, Opaque, EventPtr, Boolean*);
+
+static EventKey events[] = {
+
+/* Event Name,   Quark, Event Type,    Detail Parser, Closure */
+
+{"KeyPress",       NULLQUARK, KeyPress,        ParseKeySym,    NULL},
+{"Key",            NULLQUARK, KeyPress,        ParseKeySym,    NULL},
+{"KeyDown",        NULLQUARK, KeyPress,        ParseKeySym,    NULL},
+{"Ctrl",            NULLQUARK, KeyPress, ParseKeyAndModifiers,(Opaque)ControlMask},
+{"Shift",           NULLQUARK, KeyPress, ParseKeyAndModifiers,(Opaque)ShiftMask},
+{"Meta",            NULLQUARK, KeyPress,   ParseKeyAndModifiers,(Opaque)NULL},
+{"KeyUp",          NULLQUARK, KeyRelease,      ParseKeySym,    NULL},
+{"KeyRelease",     NULLQUARK, KeyRelease,      ParseKeySym,    NULL},
+
+{"ButtonPress",     NULLQUARK, ButtonPress,  ParseTable,(Opaque)buttonNames},
+{"BtnDown",        NULLQUARK, ButtonPress,  ParseTable,(Opaque)buttonNames},
+{"Btn1Down",       NULLQUARK, ButtonPress,     ParseImmed,(Opaque)Button1},
+{"Btn2Down",       NULLQUARK, ButtonPress,     ParseImmed,(Opaque)Button2},
+{"Btn3Down",       NULLQUARK, ButtonPress,     ParseImmed,(Opaque)Button3},
+{"Btn4Down",       NULLQUARK, ButtonPress,     ParseImmed,(Opaque)Button4},
+{"Btn5Down",       NULLQUARK, ButtonPress,     ParseImmed,(Opaque)Button5},
+
+/* Event Name,   Quark, Event Type,    Detail Parser, Closure */
+
+{"ButtonRelease",   NULLQUARK, ButtonRelease,  ParseTable,(Opaque)buttonNames},
+{"BtnUp",          NULLQUARK, ButtonRelease,  ParseTable,(Opaque)buttonNames},
+{"Btn1Up",         NULLQUARK, ButtonRelease,    ParseImmed,(Opaque)Button1},
+{"Btn2Up",         NULLQUARK, ButtonRelease,    ParseImmed,(Opaque)Button2},
+{"Btn3Up",         NULLQUARK, ButtonRelease,    ParseImmed,(Opaque)Button3},
+{"Btn4Up",         NULLQUARK, ButtonRelease,    ParseImmed,(Opaque)Button4},
+{"Btn5Up",         NULLQUARK, ButtonRelease,    ParseImmed,(Opaque)Button5},
+
+{"MotionNotify",    NULLQUARK, MotionNotify, ParseTable, (Opaque)motionDetails},
+{"PtrMoved",       NULLQUARK, MotionNotify, ParseTable, (Opaque)motionDetails},
+{"Motion",         NULLQUARK, MotionNotify, ParseTable, (Opaque)motionDetails},
+{"MouseMoved",             NULLQUARK, MotionNotify, ParseTable, (Opaque)motionDetails},
+{"BtnMotion",  NULLQUARK, MotionNotify, ParseAddModifier, (Opaque)AnyButtonMask},
+{"Btn1Motion", NULLQUARK, MotionNotify, ParseAddModifier, (Opaque)Button1Mask},
+{"Btn2Motion", NULLQUARK, MotionNotify, ParseAddModifier, (Opaque)Button2Mask},
+{"Btn3Motion", NULLQUARK, MotionNotify, ParseAddModifier, (Opaque)Button3Mask},
+{"Btn4Motion", NULLQUARK, MotionNotify, ParseAddModifier, (Opaque)Button4Mask},
+{"Btn5Motion", NULLQUARK, MotionNotify, ParseAddModifier, (Opaque)Button5Mask},
+
+{"EnterNotify",     NULLQUARK, EnterNotify,    ParseTable,(Opaque)notifyModes},
+{"Enter",          NULLQUARK, EnterNotify,    ParseTable,(Opaque)notifyModes},
+{"EnterWindow",     NULLQUARK, EnterNotify,    ParseTable,(Opaque)notifyModes},
+
+{"LeaveNotify",     NULLQUARK, LeaveNotify,    ParseTable,(Opaque)notifyModes},
+{"LeaveWindow",     NULLQUARK, LeaveNotify,    ParseTable,(Opaque)notifyModes},
+{"Leave",          NULLQUARK, LeaveNotify,    ParseTable,(Opaque)notifyModes},
+
+/* Event Name,   Quark, Event Type,    Detail Parser, Closure */
+
+{"FocusIn",        NULLQUARK, FocusIn,   ParseTable,(Opaque)notifyModes},
+
+{"FocusOut",       NULLQUARK, FocusOut,       ParseTable,(Opaque)notifyModes},
+
+{"KeymapNotify",    NULLQUARK, KeymapNotify,   ParseNone,      NULL},
+{"Keymap",         NULLQUARK, KeymapNotify,    ParseNone,      NULL},
+
+{"Expose",         NULLQUARK, Expose,          ParseNone,      NULL},
+
+{"GraphicsExpose",  NULLQUARK, GraphicsExpose, ParseNone,      NULL},
+{"GrExp",          NULLQUARK, GraphicsExpose,  ParseNone,      NULL},
+
+{"NoExpose",       NULLQUARK, NoExpose,        ParseNone,      NULL},
+{"NoExp",          NULLQUARK, NoExpose,        ParseNone,      NULL},
+
+{"VisibilityNotify",NULLQUARK, VisibilityNotify,ParseNone,     NULL},
+{"Visible",        NULLQUARK, VisibilityNotify,ParseNone,      NULL},
+
+{"CreateNotify",    NULLQUARK, CreateNotify,   ParseNone,      NULL},
+{"Create",         NULLQUARK, CreateNotify,    ParseNone,      NULL},
+
+/* Event Name,   Quark, Event Type,    Detail Parser, Closure */
+
+{"DestroyNotify",   NULLQUARK, DestroyNotify,  ParseNone,      NULL},
+{"Destroy",        NULLQUARK, DestroyNotify,   ParseNone,      NULL},
+
+{"UnmapNotify",     NULLQUARK, UnmapNotify,    ParseNone,      NULL},
+{"Unmap",          NULLQUARK, UnmapNotify,     ParseNone,      NULL},
+
+{"MapNotify",      NULLQUARK, MapNotify,       ParseNone,      NULL},
+{"Map",                    NULLQUARK, MapNotify,       ParseNone,      NULL},
+
+{"MapRequest",     NULLQUARK, MapRequest,      ParseNone,      NULL},
+{"MapReq",         NULLQUARK, MapRequest,      ParseNone,      NULL},
+
+{"ReparentNotify",  NULLQUARK, ReparentNotify, ParseNone,      NULL},
+{"Reparent",       NULLQUARK, ReparentNotify,  ParseNone,      NULL},
+
+{"ConfigureNotify", NULLQUARK, ConfigureNotify,        ParseNone,      NULL},
+{"Configure",      NULLQUARK, ConfigureNotify, ParseNone,      NULL},
+
+{"ConfigureRequest",NULLQUARK, ConfigureRequest,ParseNone,     NULL},
+{"ConfigureReq",    NULLQUARK, ConfigureRequest,ParseNone,     NULL},
+
+/* Event Name,   Quark, Event Type,    Detail Parser, Closure */
+
+{"GravityNotify",   NULLQUARK, GravityNotify,  ParseNone,      NULL},
+{"Grav",           NULLQUARK, GravityNotify,   ParseNone,      NULL},
+
+{"ResizeRequest",   NULLQUARK, ResizeRequest,  ParseNone,      NULL},
+{"ResReq",         NULLQUARK, ResizeRequest,   ParseNone,      NULL},
+
+{"CirculateNotify", NULLQUARK, CirculateNotify,        ParseNone,      NULL},
+{"Circ",           NULLQUARK, CirculateNotify, ParseNone,      NULL},
+
+{"CirculateRequest",NULLQUARK, CirculateRequest,ParseNone,     NULL},
+{"CircReq",        NULLQUARK, CirculateRequest,ParseNone,      NULL},
+
+{"PropertyNotify",  NULLQUARK, PropertyNotify, ParseAtom,      NULL},
+{"Prop",           NULLQUARK, PropertyNotify,  ParseAtom,      NULL},
+
+{"SelectionClear",  NULLQUARK, SelectionClear, ParseAtom,      NULL},
+{"SelClr",         NULLQUARK, SelectionClear,  ParseAtom,      NULL},
+
+{"SelectionRequest",NULLQUARK, SelectionRequest,ParseAtom,     NULL},
+{"SelReq",         NULLQUARK, SelectionRequest,ParseAtom,      NULL},
+
+/* Event Name,   Quark, Event Type,    Detail Parser, Closure */
+
+{"SelectionNotify", NULLQUARK, SelectionNotify,        ParseAtom,      NULL},
+{"Select",         NULLQUARK, SelectionNotify, ParseAtom,      NULL},
+
+{"ColormapNotify",  NULLQUARK, ColormapNotify, ParseNone,      NULL},
+{"Clrmap",         NULLQUARK, ColormapNotify,  ParseNone,      NULL},
+
+{"ClientMessage",   NULLQUARK, ClientMessage,  ParseAtom,      NULL},
+{"Message",        NULLQUARK, ClientMessage,   ParseAtom,      NULL},
+
+{"MappingNotify",   NULLQUARK, MappingNotify, ParseTable, (Opaque)mappingNotify},
+{"Mapping",        NULLQUARK, MappingNotify, ParseTable, (Opaque)mappingNotify},
+
+#ifdef DEBUG
+# ifdef notdef
+{"Timer",          NULLQUARK, _XtTimerEventType,ParseNone,     NULL},
+# endif /* notdef */
+{"EventTimer",     NULLQUARK, _XtEventTimerEventType,ParseNone,NULL},
+#endif /* DEBUG */
+
+/* Event Name,   Quark, Event Type,    Detail Parser, Closure */
+
+};
+
+#ifndef __UNIXOS2__
+#define IsNewline(str) ((str) == '\n')
+#else
+#define IsNewline(str) ((str) == '\n' || (str) == '\r')
+#endif
+
+#define ScanFor(str, ch) \
+    while ((*(str) != (ch)) && (*(str) != '\0') && !IsNewline(*(str))) (str)++
+
+#define ScanNumeric(str)  while ('0' <= *(str) && *(str) <= '9') (str)++
+
+#define ScanAlphanumeric(str) \
+    while (('A' <= *(str) && *(str) <= 'Z') || \
+           ('a' <= *(str) && *(str) <= 'z') || \
+           ('0' <= *(str) && *(str) <= '9')) (str)++
+
+#ifndef __UNIXOS2__
+#define ScanWhitespace(str) \
+    while (*(str) == ' ' || *(str) == '\t') (str)++
+#else
+#define ScanWhitespace(str) \
+    while (*(str) == ' ' || *(str) == '\t' || *(str) == '\r') (str)++
+#endif
+
+static Boolean initialized = FALSE;
+static XrmQuark QMeta;
+static XrmQuark QCtrl;
+static XrmQuark QNone;
+static XrmQuark QAny;
+
+static void FreeEventSeq(
+    EventSeqPtr eventSeq)
+{
+    register EventSeqPtr evs = eventSeq;
+
+    while (evs != NULL) {
+       evs->state = (StatePtr) evs;
+       if (evs->next != NULL
+           && evs->next->state == (StatePtr) evs->next)
+           evs->next = NULL;
+       evs = evs->next;
+    }
+
+    evs = eventSeq;
+    while (evs != NULL) {
+       register EventPtr event = evs;
+       evs = evs->next;
+       if (evs == event) evs = NULL;
+       XtFree((char *)event);
+    }
+}
+
+static void CompileNameValueTable(
+    NameValueTable table)
+{
+    register int i;
+
+    for (i=0; table[i].name; i++)
+        table[i].signature = XrmPermStringToQuark(table[i].name);
+}
+
+static int OrderEvents(_Xconst void *a, _Xconst void *b)
+{
+    return ((((_Xconst EventKey *)a)->signature <
+            ((_Xconst EventKey *)b)->signature) ? -1 : 1);
+}
+
+static void Compile_XtEventTable(
+    EventKeys  table,
+    Cardinal   count)
+{
+    register int i;
+    register EventKeys entry = table;
+
+    for (i=count; --i >= 0; entry++)
+       entry->signature = XrmPermStringToQuark(entry->event);
+    qsort(table, count, sizeof(EventKey), OrderEvents);
+}
+
+static int OrderModifiers(_Xconst void *a, _Xconst void *b)
+{
+    return ((((_Xconst ModifierRec *)a)->signature <
+            ((_Xconst ModifierRec *)b)->signature) ? -1 : 1);
+}
+
+static void Compile_XtModifierTable(
+    ModifierKeys table,
+    Cardinal count)
+{
+    register int i;
+    register ModifierKeys entry = table;
+
+    for (i=count; --i >= 0; entry++)
+       entry->signature = XrmPermStringToQuark(entry->name);
+    qsort(table, count, sizeof(ModifierRec), OrderModifiers);
+}
+
+static String PanicModeRecovery(
+    String str)
+{
+     ScanFor(str,'\n');
+     if (*str == '\n') str++;
+     return str;
+
+}
+
+
+static void Syntax(
+    String str0,String str1)
+{
+    Cardinal num_params = 2;
+    String params[2];
+
+    params[0] = str0;
+    params[1] = str1;
+    XtWarningMsg(XtNtranslationParseError,"parseError",XtCXtToolkitError,
+                "translation table syntax error: %s %s",params,&num_params);
+}
+
+
+
+static Cardinal LookupTMEventType(
+  String eventStr,
+  Boolean *error)
+{
+    register int   i = 0, left, right;
+    register XrmQuark  signature;
+    static int         previous = 0;
+
+    LOCK_PROCESS;
+    if ((signature = StringToQuark(eventStr)) == events[previous].signature) {
+       UNLOCK_PROCESS;
+       return (Cardinal) previous;
+    }
+
+    left = 0;
+    right = XtNumber(events) - 1;
+    while (left <= right) {
+       i = (left + right) >> 1;
+       if (signature < events[i].signature)
+           right = i - 1;
+       else if (signature > events[i].signature)
+           left = i + 1;
+       else {
+           previous = i;
+           UNLOCK_PROCESS;
+           return (Cardinal) i;
+       }
+    }
+
+    Syntax("Unknown event type :  ",eventStr);
+    *error = TRUE;
+    UNLOCK_PROCESS;
+    return (Cardinal) i;
+}
+
+static void StoreLateBindings(
+    KeySym  keysymL,
+    Boolean notL,
+    KeySym keysymR,
+    Boolean notR,
+    LateBindingsPtr* lateBindings)
+{
+    LateBindingsPtr temp;
+    Boolean pair = FALSE;
+    unsigned long count,number;
+    if (lateBindings != NULL){
+        temp = *lateBindings;
+        if (temp != NULL) {
+            for (count = 0; temp[count].keysym; count++){/*EMPTY*/}
+        }
+        else count = 0;
+        if (! keysymR){
+             number = 1;pair = FALSE;
+        } else{
+             number = 2;pair = TRUE;
+        }
+
+        temp = (LateBindingsPtr)XtRealloc((char *)temp,
+            (unsigned)((count+number+1) * sizeof(LateBindings)) );
+        *lateBindings = temp;
+        temp[count].knot = notL;
+        temp[count].pair = pair;
+       if (count == 0)
+           temp[count].ref_count = 1;
+        temp[count++].keysym = keysymL;
+        if (keysymR){
+            temp[count].knot = notR;
+            temp[count].pair = FALSE;
+           temp[count].ref_count = 0;
+            temp[count++].keysym = keysymR;
+        }
+        temp[count].knot = temp[count].pair = FALSE;
+        temp[count].ref_count = 0;
+        temp[count].keysym = 0;
+    }
+}
+
+static void _XtParseKeysymMod(
+    String name,
+    LateBindingsPtr* lateBindings,
+    Boolean notFlag,
+    Value *valueP,
+    Boolean *error)
+{
+    KeySym keySym;
+    keySym = StringToKeySym(name, error);
+    *valueP = 0;
+    if (keySym != NoSymbol) {
+        StoreLateBindings(keySym,notFlag,(KeySym) NULL,FALSE,lateBindings);
+    }
+}
+
+static Boolean _XtLookupModifier(
+    XrmQuark signature,
+    LateBindingsPtr* lateBindings,
+    Boolean notFlag,
+    Value *valueP,
+    Bool constMask)
+{
+    register int i, left, right;
+    static int previous = 0;
+
+    LOCK_PROCESS;
+    if (signature == modifiers[previous].signature) {
+       if (constMask)  *valueP = modifiers[previous].value;
+       else /* if (modifiers[previous].modifierParseProc) always true */
+          (*modifiers[previous].modifierParseProc)
+             (modifiers[previous].value, lateBindings, notFlag, valueP);
+       UNLOCK_PROCESS;
+       return TRUE;
+    }
+
+    left = 0;
+    right = XtNumber(modifiers) - 1;
+    while (left <= right) {
+       i = (left + right) >> 1;
+       if (signature < modifiers[i].signature)
+           right = i - 1;
+       else if (signature > modifiers[i].signature)
+           left = i + 1;
+       else {
+           previous = i;
+           if (constMask)  *valueP = modifiers[i].value;
+           else /* if (modifiers[i].modifierParseProc) always true */
+               (*modifiers[i].modifierParseProc)
+                   (modifiers[i].value, lateBindings, notFlag, valueP);
+           UNLOCK_PROCESS;
+           return TRUE;
+       }
+    }
+    UNLOCK_PROCESS;
+    return FALSE;
+}
+
+
+static String ScanIdent(
+    register String str)
+{
+    ScanAlphanumeric(str);
+    while (
+          ('A' <= *str && *str <= 'Z')
+       || ('a' <= *str && *str <= 'z')
+       || ('0' <= *str && *str <= '9')
+       || (*str == '-')
+       || (*str == '_')
+       || (*str == '$')
+       ) str++;
+    return str;
+}
+
+static String FetchModifierToken(
+    String str,
+    XrmQuark *token_return)
+{
+    String start = str;
+
+    if (*str == '$') {
+        *token_return = QMeta;
+        str++;
+        return str;
+    }
+    if (*str == '^') {
+        *token_return = QCtrl;
+        str++;
+        return str;
+    }
+    str = ScanIdent(str);
+    if (start != str) {
+       char modStrbuf[100];
+       char* modStr;
+
+       modStr = XtStackAlloc ((size_t)(str - start + 1), modStrbuf);
+       if (modStr == NULL) _XtAllocError (NULL);
+       (void) memmove(modStr, start, str-start);
+       modStr[str-start] = '\0';
+       *token_return = XrmStringToQuark(modStr);
+       XtStackFree (modStr, modStrbuf);
+       return str;
+    }
+    return str;
+}
+
+static String ParseModifiers(
+    register String str,
+    EventPtr event,
+    Boolean* error)
+{
+    register String start;
+    Boolean notFlag, exclusive, keysymAsMod;
+    Value maskBit;
+    XrmQuark Qmod;
+
+    ScanWhitespace(str);
+    start = str;
+    str = FetchModifierToken(str, &Qmod);
+    exclusive = FALSE;
+    if (start != str) {
+       if (Qmod == QNone) {
+           event->event.modifierMask = ~0;
+           event->event.modifiers = 0;
+           ScanWhitespace(str);
+           return str;
+       } else if (Qmod == QAny) { /*backward compatability*/
+           event->event.modifierMask = 0;
+           event->event.modifiers = AnyModifier;
+           ScanWhitespace(str);
+           return str;
+       }
+       str = start; /*if plain modifier, reset to beginning */
+    }
+    else while (*str == '!' || *str == ':') {
+        if (*str == '!') {
+             exclusive = TRUE;
+             str++;
+             ScanWhitespace(str);
+        }
+        if (*str == ':') {
+             event->event.standard = TRUE;
+             str++;
+             ScanWhitespace(str);
+        }
+    }
+
+    while (*str != '<') {
+        if (*str == '~') {
+             notFlag = TRUE;
+             str++;
+          } else
+              notFlag = FALSE;
+        if (*str == '@') {
+            keysymAsMod = TRUE;
+            str++;
+        }
+        else keysymAsMod = FALSE;
+       start = str;
+        str = FetchModifierToken(str, &Qmod);
+        if (start == str) {
+            Syntax("Modifier or '<' expected","");
+            *error = TRUE;
+            return PanicModeRecovery(str);
+        }
+         if (keysymAsMod) {
+             _XtParseKeysymMod(XrmQuarkToString(Qmod),
+                              &event->event.lateModifiers,
+                              notFlag,&maskBit, error);
+            if (*error)
+                 return PanicModeRecovery(str);
+
+         } else
+            if (!_XtLookupModifier(Qmod, &event->event.lateModifiers,
+                                   notFlag, &maskBit, FALSE)) {
+                Syntax("Unknown modifier name:  ", XrmQuarkToString(Qmod));
+                 *error = TRUE;
+                 return PanicModeRecovery(str);
+             }
+        event->event.modifierMask |= maskBit;
+       if (notFlag) event->event.modifiers &= ~maskBit;
+       else event->event.modifiers |= maskBit;
+        ScanWhitespace(str);
+    }
+    if (exclusive) event->event.modifierMask = ~0;
+    return str;
+}
+
+static String ParseXtEventType(
+    register String str,
+    EventPtr event,
+    Cardinal *tmEventP,
+    Boolean* error)
+{
+    String start = str;
+    char eventTypeStrbuf[100];
+    char* eventTypeStr;
+
+    ScanAlphanumeric(str);
+    eventTypeStr = XtStackAlloc ((size_t)(str - start + 1), eventTypeStrbuf);
+    if (eventTypeStr == NULL) _XtAllocError (NULL);
+    (void) memmove(eventTypeStr, start, str-start);
+    eventTypeStr[str-start] = '\0';
+    *tmEventP = LookupTMEventType(eventTypeStr,error);
+    XtStackFree (eventTypeStr, eventTypeStrbuf);
+    if (*error)
+        return PanicModeRecovery(str);
+    event->event.eventType = events[*tmEventP].eventType;
+    return str;
+}
+
+static unsigned long StrToHex(
+    String str)
+{
+    register char   c;
+    register unsigned long    val = 0;
+
+    while ((c = *str)) {
+       if ('0' <= c && c <= '9') val = val*16+c-'0';
+       else if ('a' <= c && c <= 'z') val = val*16+c-'a'+10;
+       else if ('A' <= c && c <= 'Z') val = val*16+c-'A'+10;
+       else return 0;
+       str++;
+    }
+
+    return val;
+}
+
+static unsigned long StrToOct(
+    String str)
+{
+    register char c;
+    register unsigned long  val = 0;
+
+    while ((c = *str)) {
+        if ('0' <= c && c <= '7') val = val*8+c-'0'; else return 0;
+       str++;
+    }
+
+    return val;
+}
+
+static unsigned long StrToNum(
+    String str)
+{
+    register char c;
+    register unsigned long val = 0;
+
+    if (*str == '0') {
+       str++;
+       if (*str == 'x' || *str == 'X') return StrToHex(++str);
+       else return StrToOct(str);
+    }
+
+    while ((c = *str)) {
+       if ('0' <= c && c <= '9') val = val*10+c-'0';
+       else return 0;
+       str++;
+    }
+
+    return val;
+}
+
+static KeySym StringToKeySym(
+    String str,
+    Boolean *error)
+{
+    KeySym k;
+
+    if (str == NULL || *str == '\0') return (KeySym) 0;
+
+#ifndef NOTASCII
+    /* special case single character ASCII, for speed */
+    if (*(str+1) == '\0') {
+       if (' ' <= *str && *str <= '~') return XK_space + (*str - ' ');
+    }
+#endif
+
+    if ('0' <= *str && *str <= '9') return (KeySym) StrToNum(str);
+    k = XStringToKeysym(str);
+    if (k != NoSymbol) return k;
+
+#ifdef NOTASCII
+    /* fall-back case to preserve backwards compatibility; no-one
+     * should be relying upon this!
+     */
+    if (*(str+1) == '\0') return (KeySym) *str;
+#endif
+
+    Syntax("Unknown keysym name: ", str);
+    *error = TRUE;
+    return NoSymbol;
+}
+/* ARGSUSED */
+static void ParseModImmed(
+    Value value,
+    LateBindingsPtr* lateBindings,
+    Boolean notFlag,
+    Value* valueP)
+{
+    *valueP = value;
+}
+
+ /* is only valid with keysyms that have an _L and _R in their name;
+  * and ignores keysym lookup errors (i.e. assumes only valid keysyms)
+  */
+static void ParseModSym(
+    Value value,
+    LateBindingsPtr* lateBindings,
+    Boolean notFlag,
+    Value* valueP)
+{
+    register KeySym keysymL = (KeySym)value;
+    register KeySym keysymR = keysymL + 1; /* valid for supported keysyms */
+    StoreLateBindings(keysymL,notFlag,keysymR,notFlag,lateBindings);
+    *valueP = 0;
+}
+
+#ifdef sparc
+/*
+ * The stupid optimizer in SunOS 4.0.3 and below generates bogus code that
+ * causes the value of the most recently used variable to be returned instead
+ * of the value passed in.
+ */
+static String stupid_optimizer_kludge;
+#define BROKEN_OPTIMIZER_HACK(val) stupid_optimizer_kludge = (val)
+#else
+#define BROKEN_OPTIMIZER_HACK(val) val
+#endif
+
+/* ARGSUSED */
+static String ParseImmed(
+    register String str,
+    register Opaque closure,
+    register EventPtr event,
+    Boolean* error)
+{
+    event->event.eventCode = (unsigned long)closure;
+    event->event.eventCodeMask = ~0UL;
+
+    return BROKEN_OPTIMIZER_HACK(str);
+}
+
+/* ARGSUSED */
+static String ParseAddModifier(
+    register String str,
+    register Opaque closure,
+    register EventPtr event,
+    Boolean* error)
+{
+    register unsigned long modval = (unsigned long)closure;
+    event->event.modifiers |= modval;
+    if (modval != AnyButtonMask) /* AnyButtonMask is don't-care mask */
+       event->event.modifierMask |= modval;
+
+    return BROKEN_OPTIMIZER_HACK(str);
+}
+
+
+static String ParseKeyAndModifiers(
+    String str,
+    Opaque closure,
+    EventPtr event,
+    Boolean* error)
+{
+    str = ParseKeySym(str, closure, event,error);
+    if ((unsigned long) closure == 0) {
+       Value metaMask; /* unused */
+       (void) _XtLookupModifier(QMeta, &event->event.lateModifiers, FALSE,
+                                &metaMask, FALSE);
+    } else {
+       event->event.modifiers |= (unsigned long) closure;
+       event->event.modifierMask |= (unsigned long) closure;
+    }
+    return str;
+}
+
+/*ARGSUSED*/
+static String ParseKeySym(
+    register String str,
+    Opaque closure,
+    EventPtr event,
+    Boolean* error)
+{
+    char *start;
+    char keySymNamebuf[100];
+    char* keySymName;
+
+    ScanWhitespace(str);
+
+    if (*str == '\\') {
+       keySymName = keySymNamebuf;
+       str++;
+       keySymName[0] = *str;
+       if (*str != '\0' && !IsNewline(*str)) str++;
+       keySymName[1] = '\0';
+       event->event.eventCode = StringToKeySym(keySymName, error);
+       event->event.eventCodeMask = ~0L;
+    } else if (*str == ',' || *str == ':' ||
+             /* allow leftparen to be single char symbol,
+              * for backwards compatibility
+              */
+             (*str == '(' && *(str+1) >= '0' && *(str+1) <= '9')) {
+       keySymName = keySymNamebuf; /* just so we can stackfree it later */
+       /* no detail */
+       event->event.eventCode = 0L;
+        event->event.eventCodeMask = 0L;
+    } else {
+       start = str;
+       while (
+               *str != ','
+               && *str != ':'
+               && *str != ' '
+               && *str != '\t'
+                && !IsNewline(*str)
+                && (*str != '(' || *(str+1) <= '0' || *(str+1) >= '9')
+               && *str != '\0') str++;
+       keySymName = XtStackAlloc ((size_t)(str - start + 1), keySymNamebuf);
+       (void) memmove(keySymName, start, str-start);
+       keySymName[str-start] = '\0';
+       event->event.eventCode = StringToKeySym(keySymName, error);
+       event->event.eventCodeMask = ~0L;
+    }
+    if (*error) {
+       /* We never get here when keySymName hasn't been allocated */
+       if (keySymName[0] == '<') {
+           /* special case for common error */
+           XtWarningMsg(XtNtranslationParseError, "missingComma",
+                        XtCXtToolkitError,
+                    "... possibly due to missing ',' in event sequence.",
+                    (String*)NULL, (Cardinal*)NULL);
+       }
+       XtStackFree (keySymName, keySymNamebuf);
+       return PanicModeRecovery(str);
+    }
+    if (event->event.standard)
+       event->event.matchEvent = _XtMatchUsingStandardMods;
+    else
+       event->event.matchEvent = _XtMatchUsingDontCareMods;
+
+    XtStackFree (keySymName, keySymNamebuf);
+
+    return str;
+}
+
+static String ParseTable(
+    register String str,
+    Opaque closure,
+    EventPtr event,
+    Boolean* error)
+{
+    register String start = str;
+    register XrmQuark signature;
+    NameValueTable table = (NameValueTable) closure;
+    char tableSymName[100];
+
+    event->event.eventCode = 0L;
+    ScanAlphanumeric(str);
+    if (str == start) {event->event.eventCodeMask = 0L; return str; }
+    if (str-start >= 99) {
+       Syntax("Invalid Detail Type (string is too long).", "");
+       *error = TRUE;
+       return str;
+    }
+    (void) memmove(tableSymName, start, str-start);
+    tableSymName[str-start] = '\0';
+    signature = StringToQuark(tableSymName);
+    for (; table->signature != NULLQUARK; table++)
+       if (table->signature == signature) {
+           event->event.eventCode = table->value;
+           event->event.eventCodeMask = ~0L;
+           return str;
+       }
+
+    Syntax("Unknown Detail Type:  ", tableSymName);
+    *error = TRUE;
+    return PanicModeRecovery(str);
+}
+
+/*ARGSUSED*/
+static String ParseNone(
+    String str,
+    Opaque closure,
+    EventPtr event,
+    Boolean* error)
+{
+    event->event.eventCode = 0;
+    event->event.eventCodeMask = 0;
+
+    return BROKEN_OPTIMIZER_HACK(str);
+}
+
+/*ARGSUSED*/
+static String ParseAtom(
+    String str,
+    Opaque closure,
+    EventPtr event,
+    Boolean* error)
+{
+    ScanWhitespace(str);
+
+    if (*str == ',' || *str == ':') {
+       /* no detail */
+       event->event.eventCode = 0L;
+        event->event.eventCodeMask = 0L;
+    } else {
+       char *start, atomName[1000];
+       start = str;
+       while (
+               *str != ','
+               && *str != ':'
+               && *str != ' '
+               && *str != '\t'
+                && !IsNewline(*str)
+               && *str != '\0') str++;
+       if (str-start >= 999) {
+           Syntax( "Atom name must be less than 1000 characters long.", "" );
+           *error = TRUE;
+           return str;
+       }
+       (void) memmove(atomName, start, str-start);
+       atomName[str-start] = '\0';
+       event->event.eventCode = XrmStringToQuark(atomName);
+       event->event.matchEvent = _XtMatchAtom;
+    }
+    return str;
+}
+
+static ModifierMask buttonModifierMasks[] = {
+    0, Button1Mask, Button2Mask, Button3Mask, Button4Mask, Button5Mask
+};
+static String ParseRepeat(String, int *, Boolean *, Boolean *);
+
+static String ParseEvent(
+    register String str,
+    EventPtr   event,
+    int*       reps,
+    Boolean*   plus,
+    Boolean* error)
+{
+    Cardinal   tmEvent;
+
+    str = ParseModifiers(str, event,error);
+    if (*error) return str;
+    if (*str != '<') {
+         Syntax("Missing '<' while parsing event type.","");
+         *error = TRUE;
+         return PanicModeRecovery(str);
+    }
+    else str++;
+    str = ParseXtEventType(str, event, &tmEvent,error);
+    if (*error) return str;
+    if (*str != '>'){
+         Syntax("Missing '>' while parsing event type","");
+         *error = TRUE;
+         return PanicModeRecovery(str);
+    }
+    else str++;
+    if (*str == '(') {
+       str = ParseRepeat(str, reps, plus, error);
+       if (*error) return str;
+    }
+    str = (*(events[tmEvent].parseDetail))(
+        str, events[tmEvent].closure, event,error);
+    if (*error) return str;
+
+/* gross hack! ||| this kludge is related to the X11 protocol deficiency w.r.t.
+ * modifiers in grabs.
+ */
+    if ((event->event.eventType == ButtonRelease)
+       && (event->event.modifiers | event->event.modifierMask) /* any */
+        && (event->event.modifiers != AnyModifier))
+    {
+       event->event.modifiers
+           |= buttonModifierMasks[event->event.eventCode];
+       /* the button that is going up will always be in the modifiers... */
+    }
+
+    return str;
+}
+
+static String ParseQuotedStringEvent(
+    register String str,
+    register EventPtr event,
+    Boolean *error)
+{
+    Value metaMask;
+    char       s[2];
+
+    if (*str=='^') {
+       str++;
+       event->event.modifiers = ControlMask;
+    } else if (*str == '$') {
+       str++;
+       (void) _XtLookupModifier(QMeta, &event->event.lateModifiers, FALSE,
+                                &metaMask, FALSE);
+    }
+    if (*str == '\\')
+       str++;
+    s[0] = *str;
+    s[1] = '\0';
+    if (*str != '\0' && !IsNewline(*str)) str++;
+    event->event.eventType = KeyPress;
+    event->event.eventCode = StringToKeySym(s, error);
+    if (*error) return PanicModeRecovery(str);
+    event->event.eventCodeMask = ~0L;
+    event->event.matchEvent = _XtMatchUsingStandardMods;
+    event->event.standard = TRUE;
+
+    return str;
+}
+
+
+static EventSeqRec timerEventRec = {
+    {0, 0, NULL, _XtEventTimerEventType, 0L, 0L, NULL, False},
+    /* (StatePtr) -1 */ NULL,
+    NULL,
+    NULL
+};
+
+static void RepeatDown(
+    EventPtr *eventP,
+    int reps,
+    ActionPtr **actionsP)
+{
+    EventRec upEventRec;
+    register EventPtr event, downEvent;
+    EventPtr upEvent = &upEventRec;
+    register int i;
+
+    downEvent = event = *eventP;
+    *upEvent = *downEvent;
+    upEvent->event.eventType = ((event->event.eventType == ButtonPress) ?
+       ButtonRelease : KeyRelease);
+    if ((upEvent->event.eventType == ButtonRelease)
+       && (upEvent->event.modifiers != AnyModifier)
+        && (upEvent->event.modifiers | upEvent->event.modifierMask))
+       upEvent->event.modifiers
+           |= buttonModifierMasks[event->event.eventCode];
+
+    if (event->event.lateModifiers)
+       event->event.lateModifiers->ref_count += (reps - 1) * 2;
+
+    for (i=1; i<reps; i++) {
+
+       /* up */
+       event->next = XtNew(EventSeqRec);
+       event = event->next;
+       *event = *upEvent;
+
+       /* timer */
+       event->next = XtNew(EventSeqRec);
+       event = event->next;
+       *event = timerEventRec;
+
+       /* down */
+       event->next = XtNew(EventSeqRec);
+       event = event->next;
+       *event = *downEvent;
+
+    }
+
+    event->next = NULL;
+    *eventP = event;
+    *actionsP = &event->actions;
+}
+
+static void RepeatDownPlus(
+    EventPtr *eventP,
+    int reps,
+    ActionPtr **actionsP)
+{
+    EventRec upEventRec;
+    register EventPtr event, downEvent, lastDownEvent = NULL;
+    EventPtr upEvent = &upEventRec;
+    register int i;
+
+    downEvent = event = *eventP;
+    *upEvent = *downEvent;
+    upEvent->event.eventType = ((event->event.eventType == ButtonPress) ?
+       ButtonRelease : KeyRelease);
+    if ((upEvent->event.eventType == ButtonRelease)
+       && (upEvent->event.modifiers != AnyModifier)
+        && (upEvent->event.modifiers | upEvent->event.modifierMask))
+       upEvent->event.modifiers
+           |= buttonModifierMasks[event->event.eventCode];
+
+    if (event->event.lateModifiers)
+       event->event.lateModifiers->ref_count += reps * 2 - 1;
+
+    for (i=0; i<reps; i++) {
+
+       if (i > 0) {
+       /* down */
+       event->next = XtNew(EventSeqRec);
+       event = event->next;
+       *event = *downEvent;
+       }
+       lastDownEvent = event;
+
+       /* up */
+       event->next = XtNew(EventSeqRec);
+       event = event->next;
+       *event = *upEvent;
+
+       /* timer */
+       event->next = XtNew(EventSeqRec);
+       event = event->next;
+       *event = timerEventRec;
+
+    }
+
+    event->next = lastDownEvent;
+    *eventP = event;
+    *actionsP = &lastDownEvent->actions;
+}
+
+static void RepeatUp(
+    EventPtr *eventP,
+    int reps,
+    ActionPtr **actionsP)
+{
+    EventRec upEventRec;
+    register EventPtr event, downEvent;
+    EventPtr upEvent = &upEventRec;
+    register int i;
+
+    /* the event currently sitting in *eventP is an "up" event */
+    /* we want to make it a "down" event followed by an "up" event, */
+    /* so that sequence matching on the "state" side works correctly. */
+
+    downEvent = event = *eventP;
+    *upEvent = *downEvent;
+    downEvent->event.eventType = ((event->event.eventType == ButtonRelease) ?
+       ButtonPress : KeyPress);
+    if ((downEvent->event.eventType == ButtonPress)
+       && (downEvent->event.modifiers != AnyModifier)
+        && (downEvent->event.modifiers | downEvent->event.modifierMask))
+       downEvent->event.modifiers
+           &= ~buttonModifierMasks[event->event.eventCode];
+
+    if (event->event.lateModifiers)
+       event->event.lateModifiers->ref_count += reps * 2 - 1;
+
+    /* up */
+    event->next = XtNew(EventSeqRec);
+    event = event->next;
+    *event = *upEvent;
+
+    for (i=1; i<reps; i++) {
+
+       /* timer */
+       event->next = XtNew(EventSeqRec);
+       event = event->next;
+       *event = timerEventRec;
+
+       /* down */
+       event->next = XtNew(EventSeqRec);
+       event = event->next;
+       *event = *downEvent;
+
+       /* up */
+       event->next = XtNew(EventSeqRec);
+       event = event->next;
+       *event = *upEvent;
+
+       }
+
+    event->next = NULL;
+    *eventP = event;
+    *actionsP = &event->actions;
+}
+
+static void RepeatUpPlus(
+    EventPtr *eventP,
+    int reps,
+    ActionPtr **actionsP)
+{
+    EventRec upEventRec;
+    register EventPtr event, downEvent, lastUpEvent = NULL;
+    EventPtr upEvent = &upEventRec;
+    register int i;
+
+    /* the event currently sitting in *eventP is an "up" event */
+    /* we want to make it a "down" event followed by an "up" event, */
+    /* so that sequence matching on the "state" side works correctly. */
+
+    downEvent = event = *eventP;
+    *upEvent = *downEvent;
+    downEvent->event.eventType = ((event->event.eventType == ButtonRelease) ?
+       ButtonPress : KeyPress);
+    if ((downEvent->event.eventType == ButtonPress)
+       && (downEvent->event.modifiers != AnyModifier)
+        && (downEvent->event.modifiers | downEvent->event.modifierMask))
+       downEvent->event.modifiers
+           &= ~buttonModifierMasks[event->event.eventCode];
+
+    if (event->event.lateModifiers)
+       event->event.lateModifiers->ref_count += reps * 2;
+
+    for (i=0; i<reps; i++) {
+
+       /* up */
+       event->next = XtNew(EventSeqRec);
+       lastUpEvent = event = event->next;
+       *event = *upEvent;
+
+       /* timer */
+       event->next = XtNew(EventSeqRec);
+       event = event->next;
+       *event = timerEventRec;
+
+       /* down */
+       event->next = XtNew(EventSeqRec);
+        event = event->next;
+       *event = *downEvent;
+
+       }
+
+    event->next = lastUpEvent;
+    *eventP = event;
+    *actionsP = &lastUpEvent->actions;
+}
+
+static void RepeatOther(
+    EventPtr *eventP,
+    int reps,
+    ActionPtr **actionsP)
+{
+    register EventPtr event, tempEvent;
+    register int i;
+
+    tempEvent = event = *eventP;
+
+    if (event->event.lateModifiers)
+       event->event.lateModifiers->ref_count += reps - 1;
+
+    for (i=1; i<reps; i++) {
+       event->next = XtNew(EventSeqRec);
+       event = event->next;
+       *event = *tempEvent;
+    }
+
+    *eventP = event;
+    *actionsP = &event->actions;
+}
+
+static void RepeatOtherPlus(
+    EventPtr *eventP,
+    int reps,
+    ActionPtr **actionsP)
+{
+    register EventPtr event, tempEvent;
+    register int i;
+
+    tempEvent = event = *eventP;
+
+    if (event->event.lateModifiers)
+       event->event.lateModifiers->ref_count += reps - 1;
+
+    for (i=1; i<reps; i++) {
+       event->next = XtNew(EventSeqRec);
+       event = event->next;
+       *event = *tempEvent;
+    }
+
+    event->next = event;
+    *eventP = event;
+    *actionsP = &event->actions;
+}
+
+static void RepeatEvent(
+    EventPtr *eventP,
+    int reps,
+    Boolean plus,
+    ActionPtr **actionsP)
+{
+    switch ((*eventP)->event.eventType) {
+
+       case ButtonPress:
+       case KeyPress:
+           if (plus) RepeatDownPlus(eventP, reps, actionsP);
+           else RepeatDown(eventP, reps, actionsP);
+           break;
+
+       case ButtonRelease:
+       case KeyRelease:
+           if (plus) RepeatUpPlus(eventP, reps, actionsP);
+           else RepeatUp(eventP, reps, actionsP);
+           break;
+
+       default:
+           if (plus) RepeatOtherPlus(eventP, reps, actionsP);
+           else RepeatOther(eventP, reps, actionsP);
+    }
+}
+
+static String ParseRepeat(
+    register String str,
+    int        *reps,
+    Boolean *plus, Boolean *error)
+{
+
+    /*** Parse the repetitions, for double click etc... ***/
+    if (*str != '(' || !(isdigit(str[1]) || str[1] == '+' || str[1] == ')'))
+       return str;
+    str++;
+    if (isdigit(*str)) {
+       String start = str;
+       char repStr[7];
+       size_t len;
+
+       ScanNumeric(str);
+       len = (str - start);
+       if (len < sizeof repStr) {
+           (void) memmove(repStr, start, len);
+           repStr[len] = '\0';
+           *reps = StrToNum(repStr);
+       } else {
+           Syntax("Repeat count too large.", "");
+           *error = TRUE;
+           return str;
+       }
+    }
+    if (*reps == 0) {
+       Syntax("Missing repeat count.","");
+       *error = True;
+       return str;
+    }
+
+    if (*str == '+') {
+       *plus = TRUE;
+       str++;
+    }
+    if (*str == ')')
+       str++;
+    else {
+       Syntax("Missing ')'.","");
+       *error = TRUE;
+    }
+
+    return str;
+}
+
+/***********************************************************************
+ * ParseEventSeq
+ * Parses the left hand side of a translation table production
+ * up to, and consuming the ":".
+ * Takes a pointer to a char* (where to start parsing) and returns an
+ * event seq (in a passed in variable), having updated the String
+ **********************************************************************/
+
+static String ParseEventSeq(
+    register String str,
+    EventSeqPtr *eventSeqP,
+    ActionPtr  **actionsP,
+    Boolean *error)
+{
+    EventSeqPtr *nextEvent = eventSeqP;
+
+    *eventSeqP = NULL;
+
+    while ( *str != '\0' && !IsNewline(*str)) {
+       static Event    nullEvent =
+             {0, 0,NULL, 0, 0L, 0L,_XtRegularMatch,FALSE};
+       EventPtr        event;
+
+       ScanWhitespace(str);
+
+       if (*str == '"') {
+           str++;
+           while (*str != '"' && *str != '\0' && !IsNewline(*str)) {
+                event = XtNew(EventRec);
+                event->event = nullEvent;
+                event->state = /* (StatePtr) -1 */ NULL;
+                event->next = NULL;
+                event->actions = NULL;
+               str = ParseQuotedStringEvent(str, event,error);
+               if (*error) {
+                   XtWarningMsg(XtNtranslationParseError, "nonLatin1",
+                       XtCXtToolkitError,
+                       "... probably due to non-Latin1 character in quoted string",
+                       (String*)NULL, (Cardinal*)NULL);
+                   return PanicModeRecovery(str);
+               }
+               *nextEvent = event;
+               *actionsP = &event->actions;
+               nextEvent = &event->next;
+           }
+           if (*str != '"') {
+                Syntax("Missing '\"'.","");
+                *error = TRUE;
+                return PanicModeRecovery(str);
+             }
+             else str++;
+       } else {
+           int reps = 0;
+           Boolean plus = FALSE;
+
+            event = XtNew(EventRec);
+            event->event = nullEvent;
+            event->state = /* (StatePtr) -1 */ NULL;
+            event->next = NULL;
+            event->actions = NULL;
+
+           str = ParseEvent(str, event, &reps, &plus, error);
+            if (*error) return str;
+           *nextEvent = event;
+           *actionsP = &event->actions;
+           if (reps > 1 || plus)
+               RepeatEvent(&event, reps, plus, actionsP);
+           nextEvent = &event->next;
+       }
+       ScanWhitespace(str);
+        if (*str == ':') break;
+        else {
+            if (*str != ',') {
+                Syntax("',' or ':' expected while parsing event sequence.","");
+                *error = TRUE;
+                return PanicModeRecovery(str);
+           } else str++;
+        }
+    }
+
+    if (*str != ':') {
+        Syntax("Missing ':'after event sequence.","");
+        *error = TRUE;
+        return PanicModeRecovery(str);
+    } else str++;
+
+    return str;
+}
+
+
+static String ParseActionProc(
+    register String str,
+    XrmQuark *actionProcNameP,
+    Boolean *error)
+{
+    register String start = str;
+    char procName[200];
+
+    str = ScanIdent(str);
+    if (str-start >= 199) {
+       Syntax("Action procedure name is longer than 199 chars","");
+       *error = TRUE;
+       return str;
+    }
+    (void) memmove(procName, start, str-start);
+    procName[str-start] = '\0';
+    *actionProcNameP = XrmStringToQuark( procName );
+    return str;
+}
+
+
+static String ParseString(
+    register String str,
+    String *strP)
+{
+    register String start;
+
+    if (*str == '"') {
+       register unsigned prev_len, len;
+       str++;
+       start = str;
+       *strP = NULL;
+       prev_len = 0;
+
+       while (*str != '"' && *str != '\0') {
+           /* \"  produces double quote embedded in a quoted parameter
+            * \\" produces backslash as last character of a quoted parameter
+            */
+           if (*str == '\\' &&
+               (*(str+1) == '"' || (*(str+1) == '\\' && *(str+2) == '"'))) {
+               len = prev_len + (str-start+2);
+               *strP = XtRealloc(*strP, len);
+               (void) memmove(*strP + prev_len, start, str-start);
+               prev_len = len-1;
+               str++;
+               (*strP)[prev_len-1] = *str;
+               (*strP)[prev_len] = '\0';
+               start = str+1;
+           }
+           str++;
+       }
+       len = prev_len + (str-start+1);
+       *strP = XtRealloc(*strP, len);
+       (void) memmove( *strP + prev_len, start, str-start);
+       (*strP)[len-1] = '\0';
+       if (*str == '"') str++; else
+            XtWarningMsg(XtNtranslationParseError,"parseString",
+                      XtCXtToolkitError,"Missing '\"'.",
+                     (String *)NULL, (Cardinal *)NULL);
+    } else {
+       /* scan non-quoted string, stop on whitespace, ',' or ')' */
+       start = str;
+       while (*str != ' '
+               && *str != '\t'
+               && *str != ','
+               && *str != ')'
+                && !IsNewline(*str)
+               && *str != '\0') str++;
+       *strP = __XtMalloc((unsigned)(str-start+1));
+       (void) memmove(*strP, start, str-start);
+       (*strP)[str-start] = '\0';
+    }
+    return str;
+}
+
+
+static String ParseParamSeq(
+    register String str,
+    String **paramSeqP,
+    Cardinal *paramNumP)
+{
+    typedef struct _ParamRec *ParamPtr;
+    typedef struct _ParamRec {
+       ParamPtr next;
+       String  param;
+    } ParamRec;
+
+    ParamPtr params = NULL;
+    register Cardinal num_params = 0;
+    register Cardinal i;
+
+    ScanWhitespace(str);
+    while (*str != ')' && *str != '\0' && !IsNewline(*str)) {
+       String newStr;
+       str = ParseString(str, &newStr);
+       if (newStr != NULL) {
+           ParamPtr temp = (ParamRec*)
+               ALLOCATE_LOCAL( (unsigned)sizeof(ParamRec) );
+           if (temp == NULL) _XtAllocError (NULL);
+
+           num_params++;
+           temp->next = params;
+           params = temp;
+           temp->param = newStr;
+           ScanWhitespace(str);
+           if (*str == ',') {
+               str++;
+               ScanWhitespace(str);
+           }
+       }
+    }
+
+    if (num_params != 0) {
+       String *paramP = (String *)
+               __XtMalloc( (unsigned)(num_params+1) * sizeof(String) );
+       *paramSeqP = paramP;
+       *paramNumP = num_params;
+       paramP += num_params; /* list is LIFO right now */
+       *paramP-- = NULL;
+       for (i=0; i < num_params; i++) {
+           ParamPtr next = params->next;
+           *paramP-- = params->param;
+           DEALLOCATE_LOCAL( (char *)params );
+           params = next;
+       }
+    } else {
+       *paramSeqP = NULL;
+       *paramNumP = 0;
+    }
+
+    return str;
+}
+
+static String ParseAction(
+    String str,
+    ActionPtr actionP,
+    XrmQuark* quarkP,
+    Boolean* error)
+{
+    str = ParseActionProc(str, quarkP, error);
+    if (*error) return str;
+
+    if (*str == '(') {
+       str++;
+       str = ParseParamSeq(str, &actionP->params, &actionP->num_params);
+    } else {
+        Syntax("Missing '(' while parsing action sequence","");
+        *error = TRUE;
+        return str;
+    }
+    if (*str == ')') str++;
+    else{
+        Syntax("Missing ')' while parsing action sequence","");
+        *error = TRUE;
+        return str;
+    }
+    return str;
+}
+
+
+static String ParseActionSeq(
+    TMParseStateTree           parseTree,
+    String             str,
+    ActionPtr          *actionsP,
+    Boolean            *error)
+{
+    ActionPtr *nextActionP = actionsP;
+
+    *actionsP = NULL;
+    while (*str != '\0' && !IsNewline(*str)) {
+       register ActionPtr      action;
+       XrmQuark quark;
+
+       action = XtNew(ActionRec);
+        action->params = NULL;
+        action->num_params = 0;
+        action->next = NULL;
+
+       str = ParseAction(str, action, &quark, error);
+       if (*error) return PanicModeRecovery(str);
+
+       action->idx = _XtGetQuarkIndex(parseTree, quark);
+       ScanWhitespace(str);
+       *nextActionP = action;
+       nextActionP = &action->next;
+    }
+    if (IsNewline(*str)) str++;
+    ScanWhitespace(str);
+    return str;
+}
+
+
+static void ShowProduction(
+  String currentProduction)
+{
+    Cardinal num_params = 1;
+    String params[1];
+    size_t len;
+    char *eol, *production, productionbuf[500];
+
+#ifdef __UNIXOS2__
+    eol = strchr(currentProduction, '\r');
+    if (!eol) /* try '\n' as well below */
+#endif
+        eol = strchr(currentProduction, '\n');
+    if (eol) len = eol - currentProduction;
+    else len = strlen (currentProduction);
+    production = XtStackAlloc (len + 1, productionbuf);
+    if (production == NULL) _XtAllocError (NULL);
+    (void) memmove(production, currentProduction, len);
+    production[len] = '\0';
+
+    params[0] = production;
+    XtWarningMsg(XtNtranslationParseError, "showLine", XtCXtToolkitError,
+                "... found while parsing '%s'", params, &num_params);
+
+    XtStackFree (production, productionbuf);
+}
+
+/***********************************************************************
+ * ParseTranslationTableProduction
+ * Parses one line of event bindings.
+ ***********************************************************************/
+
+static String ParseTranslationTableProduction(
+    TMParseStateTree    parseTree,
+    register String str,
+    Boolean* error)
+{
+    EventSeqPtr        eventSeq = NULL;
+    ActionPtr  *actionsP;
+    String     production = str;
+
+    actionsP = NULL;
+    str = ParseEventSeq(str, &eventSeq, &actionsP,error);
+    if (*error == TRUE) {
+       ShowProduction(production);
+        FreeEventSeq(eventSeq);
+        return (str);
+    }
+    ScanWhitespace(str);
+    str = ParseActionSeq(parseTree, str, actionsP, error);
+    if (*error == TRUE) {
+       ShowProduction(production);
+        FreeEventSeq(eventSeq);
+        return (str);
+    }
+
+    _XtAddEventSeqToStateTree(eventSeq, parseTree);
+    FreeEventSeq(eventSeq);
+    return (str);
+}
+
+static String CheckForPoundSign(
+    String str,
+    _XtTranslateOp defaultOp,
+    _XtTranslateOp *actualOpRtn)
+{
+    String start;
+    char operation[20];
+    _XtTranslateOp opType;
+
+    opType = defaultOp;
+    ScanWhitespace(str);
+    if (*str == '#') {
+       int len;
+       str++;
+       start = str;
+       str = ScanIdent(str);
+       len = MIN(19, str-start);
+       (void) memmove(operation, start, len);
+       operation[len] = '\0';
+       if (!strcmp(operation,"replace"))
+         opType = XtTableReplace;
+       else if (!strcmp(operation,"augment"))
+         opType = XtTableAugment;
+       else if (!strcmp(operation,"override"))
+         opType = XtTableOverride;
+       ScanWhitespace(str);
+       if (IsNewline(*str)) {
+           str++;
+           ScanWhitespace(str);
+       }
+    }
+    *actualOpRtn = opType;
+    return str;
+}
+
+static XtTranslations ParseTranslationTable(
+    String     source,
+    Boolean    isAccelerator,
+    _XtTranslateOp defaultOp,
+    Boolean*   error)
+{
+    XtTranslations             xlations;
+    TMStateTree                        stateTrees[8];
+    TMParseStateTreeRec                parseTreeRec, *parseTree = &parseTreeRec;
+    XrmQuark                   stackQuarks[200];
+    TMBranchHeadRec            stackBranchHeads[200];
+    StatePtr                   stackComplexBranchHeads[200];
+    _XtTranslateOp             actualOp;
+
+    if (source == NULL)
+      return (XtTranslations)NULL;
+
+    source = CheckForPoundSign(source, defaultOp, &actualOp);
+    if (isAccelerator && actualOp == XtTableReplace)
+       actualOp = defaultOp;
+
+    parseTree->isSimple = TRUE;
+    parseTree->mappingNotifyInterest = FALSE;
+    parseTree->isAccelerator = isAccelerator;
+    parseTree->isStackBranchHeads =
+      parseTree->isStackQuarks =
+       parseTree->isStackComplexBranchHeads = TRUE;
+
+    parseTree->numQuarks =
+      parseTree->numBranchHeads =
+       parseTree->numComplexBranchHeads = 0;
+
+    parseTree->quarkTblSize =
+      parseTree->branchHeadTblSize =
+       parseTree->complexBranchHeadTblSize = 200;
+
+    parseTree->quarkTbl = stackQuarks;
+    parseTree->branchHeadTbl = stackBranchHeads;
+    parseTree->complexBranchHeadTbl = stackComplexBranchHeads;
+
+    while (source != NULL && *source != '\0') {
+       source =  ParseTranslationTableProduction(parseTree, source, error);
+       if (*error == TRUE) break;
+    }
+    stateTrees[0] = _XtParseTreeToStateTree(parseTree);
+
+    if (!parseTree->isStackQuarks)
+      XtFree((char *)parseTree->quarkTbl);
+    if (!parseTree->isStackBranchHeads)
+      XtFree((char *)parseTree->branchHeadTbl);
+    if (!parseTree->isStackComplexBranchHeads)
+      XtFree((char *)parseTree->complexBranchHeadTbl);
+
+    xlations = _XtCreateXlations(stateTrees, 1, NULL, NULL);
+    xlations->operation = actualOp;
+
+#ifdef notdef
+    XtFree(stateTrees);
+#endif /* notdef */
+    return xlations;
+}
+
+/*** public procedures ***/
+
+/*ARGSUSED*/
+Boolean XtCvtStringToAcceleratorTable(
+    Display*   dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr from,
+    XrmValuePtr to,
+    XtPointer  *closure)
+{
+    String str;
+    Boolean error = FALSE;
+
+    if (*num_args != 0)
+        XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+         "wrongParameters","cvtStringToAcceleratorTable",XtCXtToolkitError,
+          "String to AcceleratorTable conversion needs no extra arguments",
+         (String *)NULL, (Cardinal *)NULL);
+    str = (String)(from->addr);
+    if (str == NULL) {
+        XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+         "badParameters","cvtStringToAcceleratorTable",XtCXtToolkitError,
+          "String to AcceleratorTable conversion needs string",
+         (String *)NULL, (Cardinal *)NULL);
+       return FALSE;
+    }
+    if (to->addr != NULL) {
+       if (to->size < sizeof(XtAccelerators)) {
+           to->size = sizeof(XtAccelerators);
+           return FALSE;
+       }
+       *(XtAccelerators*)to->addr =
+           (XtAccelerators) ParseTranslationTable(str, TRUE, XtTableAugment, &error);
+    }
+    else {
+       static XtAccelerators staticStateTable;
+       staticStateTable =
+           (XtAccelerators) ParseTranslationTable(str, TRUE, XtTableAugment, &error);
+       to->addr = (XPointer) &staticStateTable;
+       to->size = sizeof(XtAccelerators);
+    }
+    if (error == TRUE)
+        XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+         "parseError","cvtStringToAcceleratorTable",XtCXtToolkitError,
+          "String to AcceleratorTable conversion encountered errors",
+         (String *)NULL, (Cardinal *)NULL);
+    return (error != TRUE);
+}
+
+
+/*ARGSUSED*/
+Boolean
+XtCvtStringToTranslationTable(
+    Display    *dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr from,
+    XrmValuePtr to,
+    XtPointer  *closure_ret)
+{
+    String str;
+    Boolean error = FALSE;
+
+    if (*num_args != 0)
+      XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+           "wrongParameters","cvtStringToTranslationTable",XtCXtToolkitError,
+           "String to TranslationTable conversion needs no extra arguments",
+           (String *)NULL, (Cardinal *)NULL);
+    str = (String)(from->addr);
+    if (str == NULL) {
+        XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+         "badParameters","cvtStringToTranslation",XtCXtToolkitError,
+          "String to TranslationTable conversion needs string",
+         (String *)NULL, (Cardinal *)NULL);
+       return FALSE;
+    }
+    if (to->addr != NULL) {
+       if (to->size < sizeof(XtTranslations)) {
+           to->size = sizeof(XtTranslations);
+           return FALSE;
+       }
+       *(XtTranslations*)to->addr =
+           ParseTranslationTable(str, FALSE, XtTableReplace, &error);
+    }
+    else {
+       static XtTranslations staticStateTable;
+       staticStateTable =
+           ParseTranslationTable(str, FALSE, XtTableReplace, &error);
+       to->addr = (XPointer) &staticStateTable;
+       to->size = sizeof(XtTranslations);
+    }
+    if (error == TRUE)
+        XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+         "parseError","cvtStringToTranslationTable",XtCXtToolkitError,
+          "String to TranslationTable conversion encountered errors",
+         (String *)NULL, (Cardinal *)NULL);
+    return (error != TRUE);
+}
+
+
+/*
+ * Parses a user's or applications translation table
+ */
+XtAccelerators XtParseAcceleratorTable(
+    _Xconst char* source)
+{
+    Boolean error = FALSE;
+    XtAccelerators ret =
+       (XtAccelerators) ParseTranslationTable ((char *)source, TRUE, XtTableAugment, &error);
+    if (error == TRUE)
+        XtWarningMsg ("parseError", "cvtStringToAcceleratorTable",
+         XtCXtToolkitError,
+          "String to AcceleratorTable conversion encountered errors",
+         (String *)NULL, (Cardinal *)NULL);
+    return ret;
+}
+
+XtTranslations XtParseTranslationTable(
+    _Xconst char* source)
+{
+    Boolean error = FALSE;
+    XtTranslations ret = ParseTranslationTable((char *)source, FALSE, XtTableReplace, &error);
+    if (error == TRUE)
+        XtWarningMsg ("parseError",
+         "cvtStringToTranslationTable", XtCXtToolkitError,
+          "String to TranslationTable conversion encountered errors",
+         (String *)NULL, (Cardinal *)NULL);
+    return ret;
+}
+
+void _XtTranslateInitialize(void)
+{
+    LOCK_PROCESS;
+    if (initialized) {
+       XtWarningMsg("translationError","xtTranslateInitialize",
+                  XtCXtToolkitError,"Initializing Translation manager twice.",
+                    (String *)NULL, (Cardinal *)NULL);
+       UNLOCK_PROCESS;
+       return;
+    }
+
+    initialized = TRUE;
+    UNLOCK_PROCESS;
+    QMeta = XrmPermStringToQuark("Meta");
+    QCtrl = XrmPermStringToQuark("Ctrl");
+    QNone = XrmPermStringToQuark("None");
+    QAny  = XrmPermStringToQuark("Any");
+
+    Compile_XtEventTable( events, XtNumber(events) );
+    Compile_XtModifierTable( modifiers, XtNumber(modifiers) );
+    CompileNameValueTable( buttonNames );
+    CompileNameValueTable( notifyModes );
+    CompileNameValueTable( motionDetails );
+#if 0
+    CompileNameValueTable( notifyDetail );
+    CompileNameValueTable( visibilityNotify );
+    CompileNameValueTable( circulation );
+    CompileNameValueTable( propertyChanged );
+#endif
+    CompileNameValueTable( mappingNotify );
+}
+
+void _XtAddTMConverters(
+    ConverterTable table)
+{
+     _XtTableAddConverter(table,
+            _XtQString,
+            XrmPermStringToQuark(XtRTranslationTable),
+            XtCvtStringToTranslationTable, (XtConvertArgList) NULL,
+            (Cardinal)0, True, CACHED, _XtFreeTranslations, True);
+     _XtTableAddConverter(table, _XtQString,
+            XrmPermStringToQuark(XtRAcceleratorTable),
+            XtCvtStringToAcceleratorTable, (XtConvertArgList) NULL,
+            (Cardinal)0, True, CACHED, _XtFreeTranslations, True);
+     _XtTableAddConverter(table,
+            XrmPermStringToQuark( _XtRStateTablePair ),
+            XrmPermStringToQuark(XtRTranslationTable),
+            _XtCvtMergeTranslations, (XtConvertArgList) NULL,
+            (Cardinal)0, True, CACHED, _XtFreeTranslations, True);
+}
diff --git a/src/TMprint.c b/src/TMprint.c
new file mode 100644 (file)
index 0000000..6c469f1
--- /dev/null
@@ -0,0 +1,897 @@
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+/*LINTLIBRARY*/
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include <stdio.h>
+
+typedef struct _TMStringBufRec{
+    String     start;
+    String     current;
+    Cardinal   max;
+}TMStringBufRec, *TMStringBuf;
+
+
+#define STR_THRESHOLD 25
+#define STR_INCAMOUNT 100
+#define CHECK_STR_OVERFLOW(sb) \
+if (sb->current - sb->start > (int)sb->max - STR_THRESHOLD)    \
+{ String old = sb->start; \
+  sb->start = XtRealloc(old, (Cardinal)(sb->max += STR_INCAMOUNT)); \
+  sb->current = sb->current - old + sb->start; \
+}
+
+#define ExpandForChars(sb, nchars ) \
+    if ((unsigned)(sb->current - sb->start) > sb->max - STR_THRESHOLD - nchars) { \
+       String old = sb->start;                                 \
+       sb->start = XtRealloc(old,                              \
+           (Cardinal)(sb->max += STR_INCAMOUNT + nchars));     \
+       sb->current = sb->current - old + sb->start;            \
+    }
+
+#define ExpandToFit(sb, more) \
+{                                                              \
+       size_t l = strlen(more);                                \
+       ExpandForChars(sb, l);                                  \
+      }
+
+static void PrintModifiers(
+    TMStringBuf        sb,
+    unsigned long mask, unsigned long mod)
+{
+    Boolean notfirst = False;
+    CHECK_STR_OVERFLOW(sb);
+
+    if (mask == ~0UL && mod == 0) {
+       *sb->current++ = '!';
+       *sb->current = '\0';
+       return;
+    }
+
+#define PRINTMOD(modmask,modstring) \
+    if (mask & modmask) {               \
+       if (! (mod & modmask)) {         \
+           *sb->current++ = '~';                \
+           notfirst = True;             \
+       }                                \
+       else if (notfirst)               \
+           *sb->current++ = ' ';                \
+       else notfirst = True;            \
+       strcpy(sb->current, modstring);          \
+       sb->current += strlen(sb->current);              \
+    }
+
+    PRINTMOD(ShiftMask, "Shift");
+    PRINTMOD(ControlMask, "Ctrl");     /* name is not CtrlMask... */
+    PRINTMOD(LockMask, "Lock");
+    PRINTMOD(Mod1Mask, "Mod1");
+    CHECK_STR_OVERFLOW(sb);
+    PRINTMOD(Mod2Mask, "Mod2");
+    PRINTMOD(Mod3Mask, "Mod3");
+    PRINTMOD(Mod4Mask, "Mod4");
+    PRINTMOD(Mod5Mask, "Mod5");
+    CHECK_STR_OVERFLOW(sb);
+    PRINTMOD(Button1Mask, "Button1");
+    PRINTMOD(Button2Mask, "Button2");
+    PRINTMOD(Button3Mask, "Button3");
+    CHECK_STR_OVERFLOW(sb);
+    PRINTMOD(Button4Mask, "Button4");
+    PRINTMOD(Button5Mask, "Button5");
+
+#undef PRINTMOD
+}
+
+static void PrintEventType(
+    TMStringBuf        sb,
+    unsigned long event)
+{
+    CHECK_STR_OVERFLOW(sb);
+    switch (event) {
+#define PRINTEVENT(event, name) case event: (void) strcpy(sb->current, name); break;
+       PRINTEVENT(KeyPress, "<KeyPress>")
+       PRINTEVENT(KeyRelease, "<KeyRelease>")
+       PRINTEVENT(ButtonPress, "<ButtonPress>")
+       PRINTEVENT(ButtonRelease, "<ButtonRelease>")
+       PRINTEVENT(MotionNotify, "<MotionNotify>")
+       PRINTEVENT(EnterNotify, "<EnterNotify>")
+       PRINTEVENT(LeaveNotify, "<LeaveNotify>")
+       PRINTEVENT(FocusIn, "<FocusIn>")
+       PRINTEVENT(FocusOut, "<FocusOut>")
+       PRINTEVENT(KeymapNotify, "<KeymapNotify>")
+       PRINTEVENT(Expose, "<Expose>")
+       PRINTEVENT(GraphicsExpose, "<GraphicsExpose>")
+       PRINTEVENT(NoExpose, "<NoExpose>")
+       PRINTEVENT(VisibilityNotify, "<VisibilityNotify>")
+       PRINTEVENT(CreateNotify, "<CreateNotify>")
+       PRINTEVENT(DestroyNotify, "<DestroyNotify>")
+       PRINTEVENT(UnmapNotify, "<UnmapNotify>")
+       PRINTEVENT(MapNotify, "<MapNotify>")
+       PRINTEVENT(MapRequest, "<MapRequest>")
+       PRINTEVENT(ReparentNotify, "<ReparentNotify>")
+       PRINTEVENT(ConfigureNotify, "<ConfigureNotify>")
+       PRINTEVENT(ConfigureRequest, "<ConfigureRequest>")
+       PRINTEVENT(GravityNotify, "<GravityNotify>")
+       PRINTEVENT(ResizeRequest, "<ResizeRequest>")
+       PRINTEVENT(CirculateNotify, "<CirculateNotify>")
+       PRINTEVENT(CirculateRequest, "<CirculateRequest>")
+       PRINTEVENT(PropertyNotify, "<PropertyNotify>")
+       PRINTEVENT(SelectionClear, "<SelectionClear>")
+       PRINTEVENT(SelectionRequest, "<SelectionRequest>")
+       PRINTEVENT(SelectionNotify, "<SelectionNotify>")
+       PRINTEVENT(ColormapNotify, "<ColormapNotify>")
+       PRINTEVENT(ClientMessage, "<ClientMessage>")
+       case _XtEventTimerEventType:
+           (void) strcpy(sb->current,"<EventTimer>");
+           break;
+       default:
+           (void) sprintf(sb->current, "<0x%x>", (int) event);
+#undef PRINTEVENT
+    }
+    sb->current += strlen(sb->current);
+}
+
+static void PrintCode(
+    TMStringBuf sb,
+    unsigned long mask, unsigned long code)
+{
+    CHECK_STR_OVERFLOW(sb);
+    if (mask != 0) {
+       if (mask != ~0UL)
+           (void) sprintf(sb->current, "0x%lx:0x%lx", mask, code);
+       else (void) sprintf(sb->current, /*"0x%lx"*/ "%d", (unsigned)code);
+       sb->current += strlen(sb->current);
+    }
+}
+
+static void PrintKeysym(
+    TMStringBuf sb,
+    KeySym keysym)
+{
+    String keysymName;
+
+    if (keysym == 0) return;
+
+    CHECK_STR_OVERFLOW(sb);
+    keysymName = XKeysymToString(keysym);
+    if (keysymName == NULL)
+      PrintCode(sb,~0UL,(unsigned long)keysym);
+    else {
+      ExpandToFit(sb, keysymName);
+      strcpy(sb->current, keysymName);
+      sb->current += strlen(sb->current);
+    }
+}
+
+static void PrintAtom(
+    TMStringBuf sb,
+    Display *dpy,
+    Atom atom)
+{
+    String atomName;
+
+    if (atom == 0) return;
+
+    atomName = (dpy ? XGetAtomName(dpy, atom) : NULL);
+
+    if (! atomName)
+      PrintCode(sb,~0UL,(unsigned long)atom);
+    else {
+      ExpandToFit( sb, atomName );
+      strcpy(sb->current, atomName);
+      sb->current += strlen(sb->current);
+      XFree(atomName);
+    }
+}
+
+static void PrintLateModifiers(
+    TMStringBuf        sb,
+    LateBindingsPtr lateModifiers)
+{
+    for (; lateModifiers->keysym; lateModifiers++) {
+       CHECK_STR_OVERFLOW(sb);
+       if (lateModifiers->knot) {
+           *sb->current++ = '~';
+       } else {
+           *sb->current++ = ' ';
+       }
+       strcpy(sb->current, XKeysymToString(lateModifiers->keysym));
+       sb->current += strlen(sb->current);
+       if (lateModifiers->pair) {
+           *(sb->current -= 2) = '\0'; /* strip "_L" */
+           lateModifiers++;    /* skip _R keysym */
+       }
+    }
+}
+
+static void PrintEvent(
+    TMStringBuf sb,
+    register TMTypeMatch typeMatch,
+    register TMModifierMatch modMatch,
+    Display *dpy)
+{
+    if (modMatch->standard) *sb->current++ = ':';
+
+    PrintModifiers(sb, modMatch->modifierMask, modMatch->modifiers);
+    if (modMatch->lateModifiers != NULL)
+      PrintLateModifiers(sb, modMatch->lateModifiers);
+    PrintEventType(sb, typeMatch->eventType);
+    switch (typeMatch->eventType) {
+      case KeyPress:
+      case KeyRelease:
+       PrintKeysym(sb, (KeySym)typeMatch->eventCode);
+       break;
+
+      case PropertyNotify:
+      case SelectionClear:
+      case SelectionRequest:
+      case SelectionNotify:
+      case ClientMessage:
+       PrintAtom(sb, dpy, (Atom)typeMatch->eventCode);
+       break;
+
+      default:
+       PrintCode(sb, typeMatch->eventCodeMask, typeMatch->eventCode);
+    }
+}
+
+static void PrintParams(
+    TMStringBuf        sb,
+    String     *params,
+    Cardinal num_params)
+{
+    register Cardinal i;
+    for (i = 0; i<num_params; i++) {
+       ExpandToFit( sb, params[i] );
+       if (i != 0) {
+           *sb->current++ = ',';
+           *sb->current++ = ' ';
+       }
+       *sb->current++ = '"';
+       strcpy(sb->current, params[i]);
+       sb->current += strlen(sb->current);
+       *sb->current++ = '"';
+    }
+    *sb->current = '\0';
+}
+
+static void PrintActions(
+    TMStringBuf        sb,
+    register ActionPtr actions,
+    XrmQuark *quarkTbl,
+    Widget   accelWidget)
+{
+    while (actions != NULL) {
+       String proc;
+
+       *sb->current++ = ' ';
+
+       if (accelWidget) {
+           /* accelerator */
+           String name = XtName(accelWidget);
+           int nameLen = strlen(name);
+           ExpandForChars(sb,  nameLen );
+           XtMemmove(sb->current, name, nameLen );
+           sb->current += nameLen;
+           *sb->current++ = '`';
+       }
+       proc = XrmQuarkToString(quarkTbl[actions->idx]);
+       ExpandToFit( sb, proc );
+       strcpy(sb->current, proc);
+       sb->current += strlen(proc);
+       *sb->current++ = '(';
+       PrintParams(sb, actions->params, actions->num_params);
+       *sb->current++ = ')';
+       actions = actions->next;
+    }
+    *sb->current = '\0';
+}
+
+static Boolean LookAheadForCycleOrMulticlick(
+    register StatePtr state,
+    StatePtr *state_return,    /* state to print, usually startState */
+    int *countP,
+    StatePtr *nextLevelP)
+{
+    int repeatCount = 0;
+    StatePtr   startState = state;
+    Boolean    isCycle = startState->isCycleEnd;
+    TMTypeMatch sTypeMatch;
+    TMModifierMatch sModMatch;
+
+    LOCK_PROCESS;
+    sTypeMatch = TMGetTypeMatch(startState->typeIndex);
+    sModMatch = TMGetModifierMatch(startState->modIndex);
+
+    *state_return = startState;
+
+    for (state = state->nextLevel; state != NULL; state = state->nextLevel) {
+       TMTypeMatch typeMatch = TMGetTypeMatch(state->typeIndex);
+       TMModifierMatch modMatch = TMGetModifierMatch(state->modIndex);
+
+       /* try to pick up the correct state with actions, to be printed */
+       /* This is to accommodate <ButtonUp>(2+), for example */
+       if (state->isCycleStart)
+           *state_return = state;
+
+       if (state->isCycleEnd) {
+           *countP = repeatCount;
+           UNLOCK_PROCESS;
+           return True;
+       }
+       if ((startState->typeIndex == state->typeIndex) &&
+           (startState->modIndex == state->modIndex)) {
+           repeatCount++;
+           *nextLevelP = state;
+       }
+       else if (typeMatch->eventType == _XtEventTimerEventType)
+         continue;
+       else /* not same event as starting event and not timer */ {
+           unsigned int type = sTypeMatch->eventType;
+           unsigned int t = typeMatch->eventType;
+           if (   (type == ButtonPress   && t != ButtonRelease)
+               || (type == ButtonRelease && t != ButtonPress)
+               || (type == KeyPress      && t != KeyRelease)
+               || (type == KeyRelease    && t != KeyPress)
+               || typeMatch->eventCode != sTypeMatch->eventCode
+               || modMatch->modifiers != sModMatch->modifiers
+               || modMatch->modifierMask != sModMatch->modifierMask
+               || modMatch->lateModifiers != sModMatch->lateModifiers
+               || typeMatch->eventCodeMask != sTypeMatch->eventCodeMask
+               || typeMatch->matchEvent != sTypeMatch->matchEvent
+               || modMatch->standard != sModMatch->standard)
+               /* not inverse of starting event, either */
+               break;
+       }
+    }
+    *countP = repeatCount;
+    UNLOCK_PROCESS;
+    return isCycle;
+}
+
+static void PrintComplexState(
+    TMStringBuf        sb,
+    Boolean    includeRHS,
+    StatePtr   state,
+    TMStateTree stateTree,
+    Widget     accelWidget,
+    Display    *dpy)
+{
+    int                clickCount = 0;
+    Boolean            cycle;
+    StatePtr           nextLevel = NULL;
+    StatePtr           triggerState = NULL;
+
+    /* print the current state */
+    if (! state) return;
+    LOCK_PROCESS;
+    cycle = LookAheadForCycleOrMulticlick(state, &triggerState, &clickCount,
+                                         &nextLevel);
+
+    PrintEvent(sb, TMGetTypeMatch(triggerState->typeIndex),
+              TMGetModifierMatch(triggerState->modIndex), dpy);
+
+    if (cycle || clickCount) {
+       if (clickCount)
+           sprintf(sb->current, "(%d%s)", clickCount+1, cycle ? "+" : "");
+       else
+           (void) strncpy(sb->current, "(+)", 4);
+       sb->current += strlen(sb->current);
+       if (! state->actions && nextLevel)
+           state = nextLevel;
+       while (! state->actions && ! state->isCycleEnd)
+           state = state->nextLevel;   /* should be trigger state */
+    }
+
+    if (state->actions) {
+       if (includeRHS) {
+           CHECK_STR_OVERFLOW(sb);
+           *sb->current++ = ':';
+           PrintActions(sb,
+                        state->actions,
+                        ((TMSimpleStateTree)stateTree)->quarkTbl,
+                        accelWidget);
+           *sb->current++ = '\n';
+       }
+    }
+    else {
+       if (state->nextLevel && !cycle && !clickCount)
+           *sb->current++ = ',';
+       else {
+           /* no actions are attached to this production */
+           *sb->current++ = ':';
+           *sb->current++ = '\n';
+       }
+    }
+    *sb->current = '\0';
+
+    /* print succeeding states */
+    if (state->nextLevel && !cycle && !clickCount)
+       PrintComplexState(sb, includeRHS, state->nextLevel,
+                         stateTree, accelWidget, dpy);
+    UNLOCK_PROCESS;
+}
+
+typedef struct{
+    TMShortCard        tIndex;
+    TMShortCard        bIndex;
+}PrintRec, *Print;
+
+static int FindNextMatch(
+    PrintRec           *printData,
+    TMShortCard                numPrints,
+    XtTranslations     xlations,
+    TMBranchHead       branchHead,
+    StatePtr           nextLevel,
+    TMShortCard                startIndex)
+{
+    TMShortCard                i;
+    TMComplexStateTree         stateTree;
+    StatePtr           currState, candState;
+    Boolean            noMatch = True;
+    TMBranchHead       prBranchHead;
+
+    for (i = startIndex; noMatch && i < numPrints; i++) {
+       stateTree = (TMComplexStateTree)
+         xlations->stateTreeTbl[printData[i].tIndex];
+       prBranchHead =
+         &(stateTree->branchHeadTbl[printData[i].bIndex]);
+
+       if ((prBranchHead->typeIndex == branchHead->typeIndex) &&
+           (prBranchHead->modIndex == branchHead->modIndex)) {
+           if (prBranchHead->isSimple) {
+               if (!nextLevel)
+                 return i;
+           }
+           else {
+               currState = TMComplexBranchHead(stateTree, prBranchHead);
+               currState = currState->nextLevel;
+               candState = nextLevel;
+               for (;
+                    ((currState && !currState->isCycleEnd) &&
+                     (candState && !candState->isCycleEnd));
+                    currState = currState->nextLevel,
+                    candState = candState->nextLevel) {
+                   if ((currState->typeIndex != candState->typeIndex) ||
+                       (currState->modIndex != candState->modIndex))
+                     break;
+               }
+               if (candState == currState) {
+                   return i;
+               }
+           }
+       }
+    }
+    return TM_NO_MATCH;
+}
+
+static void ProcessLaterMatches(
+    PrintRec   *printData,
+    XtTranslations xlations,
+    TMShortCard        tIndex,
+    int bIndex,
+    TMShortCard        *numPrintsRtn)
+{
+    TMComplexStateTree         stateTree;
+    int                        i, j;
+    TMBranchHead       branchHead, matchBranch = NULL;
+
+    for (i = tIndex; i < (int)xlations->numStateTrees; i++) {
+       stateTree = (TMComplexStateTree)xlations->stateTreeTbl[i];
+       if (i == tIndex) {
+           matchBranch = &stateTree->branchHeadTbl[bIndex];
+           j = bIndex+1;
+       }
+       else j = 0;
+       for (branchHead = &stateTree->branchHeadTbl[j];
+            j < (int)stateTree->numBranchHeads;
+            j++, branchHead++) {
+           if ((branchHead->typeIndex == matchBranch->typeIndex) &&
+               (branchHead->modIndex == matchBranch->modIndex)) {
+               StatePtr state;
+               if (!branchHead->isSimple)
+                 state = TMComplexBranchHead(stateTree, branchHead);
+               else
+                 state = NULL;
+               if ((!branchHead->isSimple || branchHead->hasActions) &&
+                   (FindNextMatch(printData,
+                                  *numPrintsRtn,
+                                  xlations,
+                                  branchHead,
+                                  (state ? state->nextLevel : NULL),
+                                  0) == TM_NO_MATCH)) {
+                   printData[*numPrintsRtn].tIndex = i;
+                   printData[*numPrintsRtn].bIndex = j;
+                   (*numPrintsRtn)++;
+               }
+           }
+       }
+    }
+}
+
+static void ProcessStateTree(
+    PrintRec   *printData,
+    XtTranslations xlations,
+    TMShortCard        tIndex,
+    TMShortCard        *numPrintsRtn)
+{
+    TMComplexStateTree stateTree;
+    int                        i;
+    TMBranchHead       branchHead;
+
+    stateTree = (TMComplexStateTree)xlations->stateTreeTbl[tIndex];
+
+    for (i = 0, branchHead = stateTree->branchHeadTbl;
+        i < (int)stateTree->numBranchHeads;
+        i++, branchHead++) {
+       StatePtr state;
+       if (!branchHead->isSimple)
+         state = TMComplexBranchHead(stateTree, branchHead);
+       else
+         state = NULL;
+       if (FindNextMatch(printData, *numPrintsRtn, xlations, branchHead,
+                         (state ? state->nextLevel : NULL), 0)
+           == TM_NO_MATCH) {
+           if (!branchHead->isSimple || branchHead->hasActions) {
+               printData[*numPrintsRtn].tIndex = tIndex;
+               printData[*numPrintsRtn].bIndex = i;
+               (*numPrintsRtn)++;
+           }
+           LOCK_PROCESS;
+           if (_XtGlobalTM.newMatchSemantics == False)
+             ProcessLaterMatches(printData,
+                                 xlations,
+                                 tIndex,
+                                 i,
+                                 numPrintsRtn);
+           UNLOCK_PROCESS;
+       }
+    }
+}
+
+static void PrintState(
+    TMStringBuf        sb,
+    TMStateTree        tree,
+    TMBranchHead branchHead,
+    Boolean    includeRHS,
+    Widget     accelWidget,
+    Display    *dpy)
+{
+    TMComplexStateTree stateTree = (TMComplexStateTree)tree;
+    LOCK_PROCESS;
+    if (branchHead->isSimple) {
+       PrintEvent(sb,
+                  TMGetTypeMatch(branchHead->typeIndex),
+                  TMGetModifierMatch(branchHead->modIndex),
+                  dpy);
+       if (includeRHS) {
+           ActionRec   actRec;
+
+           CHECK_STR_OVERFLOW(sb);
+           *sb->current++ = ':';
+           actRec.idx = TMBranchMore(branchHead);
+           actRec.num_params = 0;
+           actRec.params = NULL;
+           actRec.next = NULL;
+           PrintActions(sb,
+                        &actRec,
+                        stateTree->quarkTbl,
+                        accelWidget);
+           *sb->current++ = '\n';
+       }
+       else
+         *sb->current++ = ',';
+#ifdef TRACE_TM
+       if (!branchHead->hasActions)
+         printf(" !! no actions !! ");
+#endif
+    }
+       else { /* it's a complex branchHead */
+           StatePtr state = TMComplexBranchHead(stateTree, branchHead);
+           PrintComplexState(sb,
+                             includeRHS,
+                             state,
+                             tree,
+                             accelWidget,
+                             (Display *)NULL);
+       }
+    *sb->current = '\0';
+    UNLOCK_PROCESS;
+}
+
+String _XtPrintXlations(
+    Widget             w,
+    XtTranslations     xlations,
+    Widget             accelWidget,
+    _XtBoolean         includeRHS)
+{
+    register Cardinal  i;
+#define STACKPRINTSIZE 250
+    PrintRec           stackPrints[STACKPRINTSIZE];
+    PrintRec           *prints;
+    TMStringBufRec     sbRec, *sb = &sbRec;
+    TMShortCard                numPrints, maxPrints;
+#ifdef TRACE_TM
+    TMBindData         bindData = (TMBindData)w->core.tm.proc_table;
+    Boolean            hasAccel = (accelWidget ? True : False);
+#endif /* TRACE_TM */
+    if (xlations == NULL) return NULL;
+
+    sb->current = sb->start = __XtMalloc((Cardinal)1000);
+    sb->max = 1000;
+    maxPrints = 0;
+    for (i = 0; i < xlations->numStateTrees; i++)
+       maxPrints +=
+         ((TMSimpleStateTree)(xlations->stateTreeTbl[i]))->numBranchHeads;
+    prints = (PrintRec *)
+      XtStackAlloc(maxPrints * sizeof(PrintRec), stackPrints);
+
+    numPrints = 0;
+    for (i = 0; i < xlations->numStateTrees; i++)
+      ProcessStateTree(prints, xlations, i, &numPrints);
+
+    for (i = 0; i < numPrints; i++) {
+       TMSimpleStateTree stateTree = (TMSimpleStateTree)
+         xlations->stateTreeTbl[prints[i].tIndex];
+       TMBranchHead branchHead =
+         &stateTree->branchHeadTbl[prints[i].bIndex];
+#ifdef TRACE_TM
+       TMComplexBindProcs      complexBindProcs;
+
+       if (hasAccel == False) {
+           accelWidget = NULL;
+           if (bindData->simple.isComplex) {
+               complexBindProcs = TMGetComplexBindEntry(bindData, 0);
+               accelWidget = complexBindProcs[prints[i].tIndex].widget;
+           }
+       }
+#endif /* TRACE_TM */
+       PrintState(sb, (TMStateTree)stateTree, branchHead,
+                  includeRHS, accelWidget, XtDisplay(w));
+    }
+    XtStackFree((XtPointer)prints, (XtPointer)stackPrints);
+    return (sb->start);
+}
+
+
+#ifndef NO_MIT_HACKS
+/*ARGSUSED*/
+void _XtDisplayTranslations(
+    Widget widget,
+    XEvent *event,
+    String *params,
+    Cardinal *num_params)
+{
+    String     xString;
+
+    xString =  _XtPrintXlations(widget,
+                               widget->core.tm.translations,
+                               NULL,
+                               True);
+    if (xString) {
+       printf("%s\n",xString);
+       XtFree(xString);
+    }
+}
+
+/*ARGSUSED*/
+void _XtDisplayAccelerators(
+    Widget widget,
+    XEvent *event,
+    String *params,
+    Cardinal *num_params)
+{
+    String     xString;
+
+
+    xString =  _XtPrintXlations(widget,
+                               widget->core.accelerators,
+                               NULL,
+                               True);
+    if (xString) {
+       printf("%s\n",xString);
+       XtFree(xString);
+    }
+}
+
+/*ARGSUSED*/
+void _XtDisplayInstalledAccelerators(
+    Widget widget,
+    XEvent *event,
+    String *params,
+    Cardinal *num_params)
+{
+    Widget eventWidget
+       = XtWindowToWidget(event->xany.display, event->xany.window);
+    register Cardinal  i;
+    TMStringBufRec     sbRec, *sb = &sbRec;
+    XtTranslations     xlations;
+#define STACKPRINTSIZE 250
+    PrintRec           stackPrints[STACKPRINTSIZE];
+    PrintRec           *prints;
+    TMShortCard                numPrints, maxPrints;
+    TMBindData bindData ;
+    TMComplexBindProcs complexBindProcs;
+
+    if ((eventWidget == NULL) ||
+       (eventWidget->core.tm.translations == NULL) )
+      return;
+
+    xlations = eventWidget->core.tm.translations;
+    bindData = (TMBindData) eventWidget->core.tm.proc_table;
+    if (bindData->simple.isComplex == False)
+      return;
+
+    sb->current = sb->start = __XtMalloc((Cardinal)1000);
+    sb->start[0] = '\0';
+    sb->max = 1000;
+    maxPrints = 0;
+    for (i = 0; i < xlations->numStateTrees; i++)
+       maxPrints +=
+         ((TMSimpleStateTree)xlations->stateTreeTbl[i])->numBranchHeads;
+    prints = (PrintRec *)
+      XtStackAlloc(maxPrints * sizeof(PrintRec), stackPrints);
+
+    numPrints = 0;
+
+    complexBindProcs = TMGetComplexBindEntry(bindData, 0);
+    for (i = 0;
+        i < xlations->numStateTrees;
+        i++, complexBindProcs++) {
+       if (complexBindProcs->widget)
+         {
+             ProcessStateTree(prints, xlations, i, &numPrints);
+         }
+    }
+    for (i = 0; i < numPrints; i++) {
+       TMSimpleStateTree stateTree = (TMSimpleStateTree)
+         xlations->stateTreeTbl[prints[i].tIndex];
+       TMBranchHead branchHead =
+         &stateTree->branchHeadTbl[prints[i].bIndex];
+
+       complexBindProcs = TMGetComplexBindEntry(bindData, 0);
+
+       PrintState(sb, (TMStateTree)stateTree, branchHead, True,
+                  complexBindProcs[prints[i].tIndex].widget,
+                  XtDisplay(widget));
+    }
+    XtStackFree((XtPointer)prints, (XtPointer)stackPrints);
+    printf("%s\n", sb->start);
+    XtFree(sb->start);
+}
+#endif /*NO_MIT_HACKS*/
+
+String _XtPrintActions(
+    register ActionRec *actions,
+    XrmQuark           *quarkTbl)
+{
+    TMStringBufRec     sbRec, *sb = &sbRec;
+
+    sb->max = 1000;
+    sb->current = sb->start = __XtMalloc((Cardinal)1000);
+    PrintActions(sb,
+                actions,
+                quarkTbl,
+                (Widget)NULL);
+    return sb->start;
+}
+
+String _XtPrintState(
+    TMStateTree                stateTree,
+    TMBranchHead       branchHead)
+{
+    TMStringBufRec     sbRec, *sb = &sbRec;
+
+    sb->current = sb->start = __XtMalloc((Cardinal)1000);
+    sb->max = 1000;
+    PrintState(sb, stateTree, branchHead,
+              True, (Widget)NULL, (Display *)NULL);
+    return sb->start;
+}
+
+
+String _XtPrintEventSeq(
+    register EventSeqPtr eventSeq,
+    Display *dpy)
+{
+    TMStringBufRec     sbRec, *sb = &sbRec;
+    TMTypeMatch                typeMatch;
+    TMModifierMatch    modMatch;
+#define MAXSEQS 100
+    EventSeqPtr                eventSeqs[MAXSEQS];
+    TMShortCard                i, j;
+    Boolean            cycle = False;
+
+    sb->current = sb->start = __XtMalloc((Cardinal)1000);
+    sb->max = 1000;
+    for (i = 0;
+        i < MAXSEQS && eventSeq != NULL && !cycle;
+        eventSeq = eventSeq->next, i++)
+      {
+         eventSeqs[i] = eventSeq;
+         for (j = 0; j < i && !cycle; j++)
+           if (eventSeqs[j] == eventSeq)
+             cycle = True;
+      }
+    LOCK_PROCESS;
+    for (j = 0; j < i; j++) {
+       typeMatch =
+         TMGetTypeMatch(_XtGetTypeIndex(&eventSeqs[j]->event));
+       modMatch =
+         TMGetModifierMatch(_XtGetModifierIndex(&eventSeqs[j]->event));
+       PrintEvent(sb, typeMatch, modMatch, dpy);
+       if (j < i)
+         *sb->current++ = ',';
+    }
+    UNLOCK_PROCESS;
+    return sb->start;
+}
diff --git a/src/TMstate.c b/src/TMstate.c
new file mode 100644 (file)
index 0000000..4a634b4
--- /dev/null
@@ -0,0 +1,2357 @@
+/***********************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+/* TMstate.c -- maintains the state table of actions for the translation
+ *              manager.
+ */
+/*LINTLIBRARY*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+
+#ifndef TM_NO_MATCH
+#define TM_NO_MATCH (-2)
+#endif /* TM_NO_MATCH */
+
+/* forward definitions */
+static StatePtr NewState(TMParseStateTree, TMShortCard, TMShortCard);
+
+
+static String XtNtranslationError = "translationError";
+
+#ifndef __EMX__
+TMGlobalRec _XtGlobalTM; /* initialized to zero K&R */
+#else
+TMGlobalRec _XtGlobalTM = {0};
+#endif
+
+#define MatchIncomingEvent(tmEvent, typeMatch, modMatch) \
+  (typeMatch->eventType == tmEvent->event.eventType && \
+   (typeMatch->matchEvent != NULL) && \
+   (*typeMatch->matchEvent)(typeMatch, modMatch, tmEvent))
+
+
+#define NumStateTrees(xlations) \
+  ((translateData->isSimple) ? 1 : (TMComplexXlations(xlations))->numTrees)
+
+static TMShortCard GetBranchHead(
+    TMParseStateTree   parseTree,
+    TMShortCard                typeIndex,
+    TMShortCard                modIndex,
+    Boolean            isDummy)
+{
+#define TM_BRANCH_HEAD_TBL_ALLOC       8
+#define TM_BRANCH_HEAD_TBL_REALLOC     8
+
+    TMBranchHead branchHead = parseTree->branchHeadTbl;
+    TMShortCard        newSize, i;
+
+    /*
+     * dummy is used as a place holder for later matching in old-style
+     * matching behavior. If there's already an entry we don't need
+     * another dummy.
+     */
+    if (isDummy) {
+       for (i = 0; i < parseTree->numBranchHeads; i++, branchHead++) {
+           if ((branchHead->typeIndex == typeIndex) &&
+               (branchHead->modIndex == modIndex))
+             return i;
+       }
+    }
+    if (parseTree->numBranchHeads == parseTree->branchHeadTblSize)
+      {
+         if (parseTree->branchHeadTblSize == 0)
+           parseTree->branchHeadTblSize += TM_BRANCH_HEAD_TBL_ALLOC;
+         else
+           parseTree->branchHeadTblSize +=
+             TM_BRANCH_HEAD_TBL_REALLOC;
+         newSize = (parseTree->branchHeadTblSize * sizeof(TMBranchHeadRec));
+         if (parseTree->isStackBranchHeads) {
+             TMBranchHead      oldBranchHeadTbl = parseTree->branchHeadTbl;
+             parseTree->branchHeadTbl = (TMBranchHead) __XtMalloc(newSize);
+             XtMemmove(parseTree->branchHeadTbl, oldBranchHeadTbl, newSize);
+             parseTree->isStackBranchHeads = False;
+         }
+         else {
+             parseTree->branchHeadTbl = (TMBranchHead)
+               XtRealloc((char *)parseTree->branchHeadTbl,
+                         (parseTree->branchHeadTblSize *
+                          sizeof(TMBranchHeadRec)));
+         }
+      }
+#ifdef TRACE_TM
+    LOCK_PROCESS;
+    _XtGlobalTM.numBranchHeads++;
+    UNLOCK_PROCESS;
+#endif /* TRACE_TM */
+    branchHead =
+      &parseTree->branchHeadTbl[parseTree->numBranchHeads++];
+    branchHead->typeIndex = typeIndex;
+    branchHead->modIndex = modIndex;
+    branchHead->more = 0;
+    branchHead->isSimple = True;
+    branchHead->hasActions = False;
+    branchHead->hasCycles = False;
+    return parseTree->numBranchHeads-1;
+}
+
+TMShortCard _XtGetQuarkIndex(
+    TMParseStateTree   parseTree,
+    XrmQuark           quark)
+{
+#define TM_QUARK_TBL_ALLOC     16
+#define TM_QUARK_TBL_REALLOC   16
+    TMShortCard  i = parseTree->numQuarks;
+
+    for (i=0; i < parseTree->numQuarks; i++)
+      if (parseTree->quarkTbl[i] == quark)
+           break;
+
+    if (i == parseTree->numQuarks)
+      {
+         if (parseTree->numQuarks == parseTree->quarkTblSize)
+           {
+               TMShortCard     newSize;
+
+               if (parseTree->quarkTblSize == 0)
+                 parseTree->quarkTblSize += TM_QUARK_TBL_ALLOC;
+               else
+                 parseTree->quarkTblSize += TM_QUARK_TBL_REALLOC;
+               newSize = (parseTree->quarkTblSize * sizeof(XrmQuark));
+
+               if (parseTree->isStackQuarks) {
+                   XrmQuark    *oldquarkTbl = parseTree->quarkTbl;
+                   parseTree->quarkTbl = (XrmQuark *) __XtMalloc(newSize);
+                   XtMemmove(parseTree->quarkTbl, oldquarkTbl, newSize);
+                   parseTree->isStackQuarks = False;
+               }
+               else {
+                   parseTree->quarkTbl = (XrmQuark *)
+                     XtRealloc((char *)parseTree->quarkTbl,
+                               (parseTree->quarkTblSize *
+                                sizeof(XrmQuark)));
+               }
+           }
+         parseTree->quarkTbl[parseTree->numQuarks++] = quark;
+      }
+    return i;
+}
+
+/*
+ * Get an entry from the parseTrees complex branchHead tbl. If there's none
+ * there then allocate one
+ */
+/*ARGSUSED*/
+static TMShortCard GetComplexBranchIndex(
+    TMParseStateTree   parseTree,
+    TMShortCard                typeIndex,
+    TMShortCard                modIndex)
+{
+#define TM_COMPLEXBRANCH_HEAD_TBL_ALLOC 8
+#define TM_COMPLEXBRANCH_HEAD_TBL_REALLOC 4
+
+    if (parseTree->numComplexBranchHeads == parseTree->complexBranchHeadTblSize) {
+       TMShortCard     newSize;
+
+       if (parseTree->complexBranchHeadTblSize == 0)
+         parseTree->complexBranchHeadTblSize += TM_COMPLEXBRANCH_HEAD_TBL_ALLOC;
+       else
+         parseTree->complexBranchHeadTblSize += TM_COMPLEXBRANCH_HEAD_TBL_REALLOC;
+
+       newSize = (parseTree->complexBranchHeadTblSize * sizeof(StatePtr));
+
+       if (parseTree->isStackComplexBranchHeads) {
+           StatePtr *oldcomplexBranchHeadTbl
+             = parseTree->complexBranchHeadTbl;
+           parseTree->complexBranchHeadTbl = (StatePtr *) __XtMalloc(newSize);
+           XtMemmove(parseTree->complexBranchHeadTbl,
+                     oldcomplexBranchHeadTbl, newSize);
+           parseTree->isStackComplexBranchHeads = False;
+       }
+       else {
+           parseTree->complexBranchHeadTbl = (StatePtr *)
+             XtRealloc((char *)parseTree->complexBranchHeadTbl,
+                       (parseTree->complexBranchHeadTblSize *
+                        sizeof(StatePtr)));
+       }
+    }
+    parseTree->complexBranchHeadTbl[parseTree->numComplexBranchHeads++] = NULL;
+    return parseTree->numComplexBranchHeads-1;
+}
+
+TMShortCard _XtGetTypeIndex(
+    Event      *event)
+{
+    TMShortCard                i, j = TM_TYPE_SEGMENT_SIZE;
+    TMShortCard                typeIndex = 0;
+    TMTypeMatch        typeMatch;
+    TMTypeMatch                segment = NULL;
+
+    LOCK_PROCESS;
+    for (i = 0; i < _XtGlobalTM.numTypeMatchSegments; i++) {
+       segment = _XtGlobalTM.typeMatchSegmentTbl[i];
+       for (j = 0;
+            typeIndex < _XtGlobalTM.numTypeMatches && j <  TM_TYPE_SEGMENT_SIZE;
+            j++, typeIndex++)
+         {
+             typeMatch = &(segment[j]);
+             if (event->eventType == typeMatch->eventType &&
+                 event->eventCode == typeMatch->eventCode &&
+                 event->eventCodeMask == typeMatch->eventCodeMask &&
+                 event->matchEvent == typeMatch->matchEvent) {
+                   UNLOCK_PROCESS;
+                   return typeIndex;
+                 }
+         }
+    }
+
+    if (j == TM_TYPE_SEGMENT_SIZE) {
+       if (_XtGlobalTM.numTypeMatchSegments == _XtGlobalTM.typeMatchSegmentTblSize) {
+           _XtGlobalTM.typeMatchSegmentTblSize += 4;
+           _XtGlobalTM.typeMatchSegmentTbl = (TMTypeMatch *)
+             XtRealloc((char *)_XtGlobalTM.typeMatchSegmentTbl,
+                       (_XtGlobalTM.typeMatchSegmentTblSize * sizeof(TMTypeMatch)));
+       }
+       _XtGlobalTM.typeMatchSegmentTbl[_XtGlobalTM.numTypeMatchSegments++] =
+         segment = (TMTypeMatch)
+           __XtMalloc(TM_TYPE_SEGMENT_SIZE * sizeof(TMTypeMatchRec));
+       j = 0;
+    }
+    typeMatch = &segment[j];
+    typeMatch->eventType = event->eventType;
+    typeMatch->eventCode = event->eventCode;
+    typeMatch->eventCodeMask = event->eventCodeMask;
+    typeMatch->matchEvent = event->matchEvent;
+    _XtGlobalTM.numTypeMatches++;
+    UNLOCK_PROCESS;
+    return typeIndex;
+}
+
+static Boolean CompareLateModifiers(
+    LateBindingsPtr lateBind1P,
+    LateBindingsPtr lateBind2P)
+{
+    LateBindingsPtr late1P = lateBind1P;
+    LateBindingsPtr late2P = lateBind2P;
+
+    if (late1P != NULL || late2P != NULL) {
+       int i = 0;
+       int j = 0;
+       if (late1P != NULL)
+         for (; late1P->keysym != NoSymbol; i++) late1P++;
+       if (late2P != NULL)
+         for (; late2P->keysym != NoSymbol; j++) late2P++;
+       if (i != j) return FALSE;
+       late1P--;
+       while (late1P >= lateBind1P) {
+           Boolean last = True;
+           for (late2P = lateBind2P + i - 1;
+                late2P >= lateBind2P;
+                late2P--) {
+               if (late1P->keysym == late2P->keysym
+                   && late1P->knot == late2P->knot) {
+                   j--;
+                   if (last) i--;
+                   break;
+               }
+               last = False;
+           }
+           late1P--;
+       }
+       if (j != 0) return FALSE;
+    }
+    return TRUE;
+}
+
+TMShortCard _XtGetModifierIndex(
+    Event      *event)
+{
+    TMShortCard                i, j = TM_MOD_SEGMENT_SIZE;
+    TMShortCard                modIndex = 0;
+    TMModifierMatch    modMatch;
+    TMModifierMatch    segment = NULL;
+
+    LOCK_PROCESS;
+    for (i = 0; i < _XtGlobalTM.numModMatchSegments; i++) {
+       segment = _XtGlobalTM.modMatchSegmentTbl[i];
+       for (j = 0;
+            modIndex < _XtGlobalTM.numModMatches && j <  TM_MOD_SEGMENT_SIZE;
+            j++, modIndex++) {
+           modMatch = &(segment[j]);
+           if (event->modifiers == modMatch->modifiers &&
+               event->modifierMask == modMatch->modifierMask &&
+               event->standard == modMatch->standard &&
+               ((!event->lateModifiers && !modMatch->lateModifiers) ||
+                CompareLateModifiers(event->lateModifiers,
+                                     modMatch->lateModifiers))) {
+               /*
+                * if we found a match then we can free the parser's
+                * late modifiers. If there isn't a match we use the
+                * parser's copy
+                */
+               if (event->lateModifiers &&
+                   --event->lateModifiers->ref_count == 0) {
+                   XtFree((char *)event->lateModifiers);
+                   event->lateModifiers = NULL;
+               }
+               UNLOCK_PROCESS;
+               return modIndex;
+           }
+       }
+    }
+
+    if (j == TM_MOD_SEGMENT_SIZE) {
+       if (_XtGlobalTM.numModMatchSegments == _XtGlobalTM.modMatchSegmentTblSize) {
+           _XtGlobalTM.modMatchSegmentTblSize += 4;
+           _XtGlobalTM.modMatchSegmentTbl = (TMModifierMatch *)
+             XtRealloc((char *)_XtGlobalTM.modMatchSegmentTbl,
+                       (_XtGlobalTM.modMatchSegmentTblSize * sizeof(TMModifierMatch)));
+       }
+       _XtGlobalTM.modMatchSegmentTbl[_XtGlobalTM.numModMatchSegments++] =
+         segment = (TMModifierMatch)
+           __XtMalloc(TM_MOD_SEGMENT_SIZE * sizeof(TMModifierMatchRec));
+       j = 0;
+    }
+    modMatch = &segment[j];
+    modMatch->modifiers = event->modifiers;;
+    modMatch->modifierMask = event->modifierMask;
+    modMatch->standard = event->standard;
+    /*
+     * We use the parser's copy of the late binding array
+     */
+#ifdef TRACE_TM
+    if (event->lateModifiers)
+      _XtGlobalTM.numLateBindings++;
+#endif /* TRACE_TM */
+    modMatch->lateModifiers = event->lateModifiers;
+    _XtGlobalTM.numModMatches++;
+    UNLOCK_PROCESS;
+    return modIndex;
+}
+
+
+/*
+ * This is called from the SimpleStateHandler to match a stateTree
+ * entry to the event coming in
+ */
+static int MatchBranchHead(
+    TMSimpleStateTree  stateTree,
+    int                        startIndex,
+    TMEventPtr         event)
+{
+    TMBranchHead branchHead = &stateTree->branchHeadTbl[startIndex];
+    int i;
+
+    LOCK_PROCESS;
+    for (i = startIndex;
+        i < (int)stateTree->numBranchHeads;
+        i++, branchHead++)
+      {
+         TMTypeMatch           typeMatch;
+         TMModifierMatch       modMatch;
+
+         typeMatch  = TMGetTypeMatch(branchHead->typeIndex);
+         modMatch = TMGetModifierMatch(branchHead->modIndex);
+
+         if (MatchIncomingEvent(event, typeMatch, modMatch)) {
+           UNLOCK_PROCESS;
+           return i;
+         }
+      }
+    UNLOCK_PROCESS;
+    return (TM_NO_MATCH);
+}
+
+Boolean _XtRegularMatch(
+    TMTypeMatch        typeMatch,
+    TMModifierMatch    modMatch,
+    TMEventPtr                 eventSeq)
+{
+    Modifiers computed =0;
+    Modifiers computedMask =0;
+    Boolean resolved = TRUE;
+    if (typeMatch->eventCode != (eventSeq->event.eventCode &
+                                 typeMatch->eventCodeMask)) return FALSE;
+    if (modMatch->lateModifiers != NULL)
+       resolved = _XtComputeLateBindings(eventSeq->xev->xany.display,
+                                         modMatch->lateModifiers,
+                                         &computed, &computedMask);
+    if (!resolved) return FALSE;
+    computed |= modMatch->modifiers;
+    computedMask |= modMatch->modifierMask;
+
+    return ( (computed & computedMask) ==
+           (eventSeq->event.modifiers & computedMask));
+}
+
+/*ARGSUSED*/
+Boolean _XtMatchAtom(
+    TMTypeMatch        typeMatch,
+    TMModifierMatch    modMatch,
+    TMEventPtr                 eventSeq)
+{
+    Atom       atom;
+
+    atom = XInternAtom(eventSeq->xev->xany.display,
+                      XrmQuarkToString(typeMatch->eventCode),
+                      False);
+    return (atom == eventSeq->event.eventCode);
+}
+
+#define IsOn(vec,idx) ((vec)[(idx)>>3] & (1 << ((idx) & 7)))
+
+/*
+ * there are certain cases where you want to ignore the event and stay
+ * in the same state.
+ */
+static Boolean Ignore(
+    TMEventPtr event)
+{
+    Display *dpy;
+    XtPerDisplay pd;
+
+    if (event->event.eventType == MotionNotify)
+       return TRUE;
+    if (!(event->event.eventType == KeyPress ||
+         event->event.eventType == KeyRelease))
+       return FALSE;
+    dpy = event->xev->xany.display;
+    pd = _XtGetPerDisplay(dpy);
+    _InitializeKeysymTables(dpy, pd);
+    return IsOn(pd->isModifier, event->event.eventCode) ? TRUE : FALSE;
+}
+
+
+static void XEventToTMEvent(
+    XEvent *event,
+    TMEventPtr tmEvent)
+{
+    tmEvent->xev = event;
+    tmEvent->event.eventCodeMask = 0;
+    tmEvent->event.modifierMask = 0;
+    tmEvent->event.eventType = event->type;
+    tmEvent->event.lateModifiers = NULL;
+    tmEvent->event.matchEvent = NULL;
+    tmEvent->event.standard = FALSE;
+
+    switch (event->type) {
+
+       case KeyPress:
+       case KeyRelease:
+            tmEvent->event.eventCode = event->xkey.keycode;
+           tmEvent->event.modifiers = event->xkey.state;
+           break;
+
+       case ButtonPress:
+       case ButtonRelease:
+           tmEvent->event.eventCode = event->xbutton.button;
+           tmEvent->event.modifiers = event->xbutton.state;
+           break;
+
+       case MotionNotify:
+           tmEvent->event.eventCode = event->xmotion.is_hint;
+           tmEvent->event.modifiers = event->xmotion.state;
+           break;
+
+       case EnterNotify:
+       case LeaveNotify:
+           tmEvent->event.eventCode = event->xcrossing.mode;
+           tmEvent->event.modifiers = event->xcrossing.state;
+           break;
+
+       case PropertyNotify:
+           tmEvent->event.eventCode = event->xproperty.atom;
+           tmEvent->event.modifiers = 0;
+           break;
+
+       case SelectionClear:
+           tmEvent->event.eventCode = event->xselectionclear.selection;
+           tmEvent->event.modifiers = 0;
+           break;
+
+       case SelectionRequest:
+           tmEvent->event.eventCode = event->xselectionrequest.selection;
+           tmEvent->event.modifiers = 0;
+           break;
+
+       case SelectionNotify:
+           tmEvent->event.eventCode = event->xselection.selection;
+           tmEvent->event.modifiers = 0;
+           break;
+
+       case ClientMessage:
+           tmEvent->event.eventCode = event->xclient.message_type;
+           tmEvent->event.modifiers = 0;
+           break;
+
+       case MappingNotify:
+           tmEvent->event.eventCode = event->xmapping.request;
+           tmEvent->event.modifiers = 0;
+           break;
+
+       case FocusIn:
+       case FocusOut:
+           tmEvent->event.eventCode = event->xfocus.mode;
+           tmEvent->event.modifiers = 0;
+           break;
+
+       default:
+           tmEvent->event.eventCode = 0;
+           tmEvent->event.modifiers = 0;
+           break;
+    }
+}
+
+
+static unsigned long GetTime(
+    XtTM tm,
+    XEvent *event)
+{
+    switch (event->type) {
+
+        case KeyPress:
+       case KeyRelease:
+           return event->xkey.time;
+
+        case ButtonPress:
+       case ButtonRelease:
+           return event->xbutton.time;
+
+       default:
+           return tm->lastEventTime;
+
+    }
+
+}
+
+static void HandleActions(
+    Widget             w,
+    XEvent             *event,
+    TMSimpleStateTree  stateTree,
+    Widget             accelWidget,
+    XtActionProc       *procs,
+    ActionRec          *actions)
+{
+    ActionHook         actionHookList;
+    Widget             bindWidget;
+
+    bindWidget = accelWidget ? accelWidget : w;
+    if (accelWidget && !XtIsSensitive(accelWidget) &&
+       (event->type == KeyPress || event->type == KeyRelease ||
+       event->type == ButtonPress || event->type == ButtonRelease ||
+       event->type == MotionNotify || event->type == EnterNotify ||
+       event->type == LeaveNotify || event->type == FocusIn ||
+       event->type == FocusOut))
+       return;
+
+    actionHookList = XtWidgetToApplicationContext(w)->action_hook_list;
+
+    while (actions != NULL) {
+       /* perform any actions */
+       if (procs[actions->idx] != NULL) {
+           if (actionHookList) {
+               ActionHook hook;
+               ActionHook next_hook;
+               String procName =
+                   XrmQuarkToString(stateTree->quarkTbl[actions->idx] );
+
+               for (hook = actionHookList; hook != NULL; ) {
+                   /*
+                    * Need to cache hook->next because the following action
+                    * proc may free hook via XtRemoveActionHook making
+                    * hook->next invalid upon return from the action proc.
+                    */
+                   next_hook = hook->next;
+                   (*hook->proc)(bindWidget,
+                                 hook->closure,
+                                 procName,
+                                 event,
+                                 actions->params,
+                                 &actions->num_params
+                                 );
+                   hook = next_hook;
+               }
+           }
+           (*(procs[actions->idx]))
+             (bindWidget, event,
+              actions->params, &actions->num_params );
+       }
+       actions = actions->next;
+    }
+}
+
+typedef struct {
+    unsigned int isCycleStart:1;
+    unsigned int isCycleEnd:1;
+    TMShortCard typeIndex;
+    TMShortCard modIndex;
+}MatchPairRec, *MatchPair;
+
+typedef struct TMContextRec{
+    TMShortCard        numMatches;
+    TMShortCard        maxMatches;
+    MatchPair  matches;
+}TMContextRec, *TMContext;
+
+static TMContextRec    contextCache[2];
+
+#define GetContextPtr(tm) ((TMContext *)&(tm->current_state))
+
+#define TM_CONTEXT_MATCHES_ALLOC 4
+#define TM_CONTEXT_MATCHES_REALLOC 2
+
+static void PushContext(
+    TMContext  *contextPtr,
+    StatePtr   newState)
+{
+    TMContext          context = *contextPtr;
+
+    LOCK_PROCESS;
+    if (context == NULL)
+      {
+         if (contextCache[0].numMatches == 0)
+           context = &contextCache[0];
+         else if (contextCache[1].numMatches == 0)
+           context = &contextCache[1];
+         if (!context)
+           {
+               context = XtNew(TMContextRec);
+               context->matches = NULL;
+               context->numMatches =
+                 context->maxMatches = 0;
+           }
+      }
+    if (context->numMatches &&
+       context->matches[context->numMatches-1].isCycleEnd)
+      {
+         TMShortCard   i;
+         for (i = 0;
+              i < context->numMatches &&
+              !(context->matches[i].isCycleStart);
+              i++){};
+         if (i < context->numMatches)
+           context->numMatches = i+1;
+#ifdef DEBUG
+         else
+           XtWarning("pushing cycle end with no cycle start");
+#endif /* DEBUG */
+      }
+    else
+      {
+         if (context->numMatches == context->maxMatches)
+           {
+               if (context->maxMatches == 0)
+                 context->maxMatches += TM_CONTEXT_MATCHES_ALLOC;
+               else
+                 context->maxMatches += TM_CONTEXT_MATCHES_REALLOC;
+               context->matches = (MatchPairRec *)
+                 XtRealloc((char *)context->matches,
+                           context->maxMatches * sizeof(MatchPairRec));
+           }
+         context->matches[context->numMatches].isCycleStart = newState->isCycleStart;
+         context->matches[context->numMatches].isCycleEnd = newState->isCycleEnd;
+         context->matches[context->numMatches].typeIndex = newState->typeIndex;
+         context->matches[context->numMatches++].modIndex = newState->modIndex;
+         *contextPtr = context;
+      }
+      UNLOCK_PROCESS;
+}
+
+static void FreeContext(
+    TMContext  *contextPtr)
+{
+    TMContext          context = NULL;
+
+    LOCK_PROCESS;
+
+    if (&contextCache[0] == *contextPtr)
+      context = &contextCache[0];
+    else if (&contextCache[1] == *contextPtr)
+      context = &contextCache[1];
+
+    if (context)
+      context->numMatches = 0;
+    else if (*contextPtr)
+    {
+      if ((*contextPtr)->matches)
+        XtFree ((char *) ((*contextPtr)->matches));
+      XtFree((char *)*contextPtr);
+    }
+
+    *contextPtr = NULL;
+    UNLOCK_PROCESS;
+}
+
+static int MatchExact(
+    TMSimpleStateTree  stateTree,
+    int                        startIndex,
+    TMShortCard                typeIndex,
+    TMShortCard                modIndex)
+{
+    TMBranchHead branchHead = &(stateTree->branchHeadTbl[startIndex]);
+    int i;
+
+    for (i = startIndex;
+        i < (int)stateTree->numBranchHeads;
+        i++, branchHead++)
+      {
+         if ((branchHead->typeIndex == typeIndex) &&
+             (branchHead->modIndex == modIndex))
+           return i;
+      }
+    return (TM_NO_MATCH);
+}
+
+
+
+static void HandleSimpleState(
+    Widget     w,
+    XtTM       tmRecPtr,
+    TMEventRec *curEventPtr)
+{
+    XtTranslations     xlations = tmRecPtr->translations;
+    TMSimpleStateTree  stateTree;
+    TMContext          *contextPtr = GetContextPtr(tmRecPtr);
+    TMShortCard                i;
+    ActionRec          *actions = NULL;
+    Boolean            matchExact = False;
+    Boolean            match = False;
+    StatePtr           complexMatchState = NULL;
+    int                        currIndex;
+    TMShortCard                typeIndex = 0, modIndex = 0;
+    int                        matchTreeIndex = TM_NO_MATCH;
+
+    LOCK_PROCESS;
+    stateTree = (TMSimpleStateTree)xlations->stateTreeTbl[0];
+
+    for (i = 0;
+        ((!match || !complexMatchState) && (i < xlations->numStateTrees));
+        i++){
+       stateTree = (TMSimpleStateTree)xlations->stateTreeTbl[i];
+       currIndex = -1;
+       /*
+        * don't process this tree if we're only looking for a
+        * complexMatchState and there are no complex states
+        */
+       while (!(match && stateTree->isSimple) &&
+              ((!match || !complexMatchState) && (currIndex != TM_NO_MATCH))) {
+           currIndex++;
+           if (matchExact)
+             currIndex = MatchExact(stateTree,currIndex,typeIndex,modIndex);
+           else
+             currIndex = MatchBranchHead(stateTree,currIndex,curEventPtr);
+           if (currIndex != TM_NO_MATCH) {
+               TMBranchHead branchHead;
+               StatePtr currState;
+
+               branchHead = &stateTree->branchHeadTbl[currIndex];
+               if (branchHead->isSimple)
+                 currState = NULL;
+               else
+                 currState = ((TMComplexStateTree)stateTree)
+                   ->complexBranchHeadTbl[TMBranchMore(branchHead)];
+
+               /*
+                * first check for a complete match
+                */
+               if (!match) {
+                   if (branchHead->hasActions) {
+                       if (branchHead->isSimple) {
+                           static ActionRec    dummyAction;
+
+                           dummyAction.idx = TMBranchMore(branchHead);
+                           actions = &dummyAction;
+                       }
+                       else
+                         actions = currState->actions;
+                       tmRecPtr->lastEventTime =
+                         GetTime(tmRecPtr, curEventPtr->xev);
+                       FreeContext((TMContext
+                                    *)&tmRecPtr->current_state);
+                       match = True;
+                       matchTreeIndex = i;
+                   }
+                   /*
+                    * if it doesn't have actions and
+                    * it's bc mode then it's a potential match node that is
+                    * used to match later sequences.
+                    */
+                   if (!TMNewMatchSemantics() && !matchExact) {
+                       matchExact = True;
+                       typeIndex = branchHead->typeIndex;
+                       modIndex = branchHead->modIndex;
+                   }
+               }
+               /*
+                * check for it being an event sequence which can be
+                * a future match
+                */
+               if (!branchHead->isSimple &&
+                   !branchHead->hasActions &&
+                   !complexMatchState)
+                 complexMatchState = currState;
+           }
+       }
+    }
+    if (match)
+      {
+         TMBindData    bindData = (TMBindData) tmRecPtr->proc_table;
+         XtActionProc  *procs;
+         Widget        accelWidget;
+
+         if (bindData->simple.isComplex) {
+             TMComplexBindProcs bindProcs =
+               TMGetComplexBindEntry(bindData, matchTreeIndex);
+             procs = bindProcs->procs;
+             accelWidget = bindProcs->widget;
+         }
+         else {
+             TMSimpleBindProcs bindProcs =
+               TMGetSimpleBindEntry(bindData, matchTreeIndex);
+             procs = bindProcs->procs;
+             accelWidget = NULL;
+         }
+         HandleActions
+           (w,
+            curEventPtr->xev,
+            (TMSimpleStateTree)xlations->stateTreeTbl[matchTreeIndex],
+            accelWidget,
+            procs,
+            actions);
+      }
+    if (complexMatchState)
+      PushContext(contextPtr, complexMatchState);
+    UNLOCK_PROCESS;
+}
+
+static int MatchComplexBranch(
+    TMComplexStateTree stateTree,
+    int                        startIndex,
+    TMContext          context,
+    StatePtr           *leafStateRtn)
+{
+    TMShortCard        i;
+
+    LOCK_PROCESS;
+    for (i = startIndex; i < stateTree->numComplexBranchHeads; i++)
+      {
+         StatePtr      candState;
+         TMShortCard   numMatches = context->numMatches;
+         MatchPair     statMatch = context->matches;
+
+         for (candState = stateTree->complexBranchHeadTbl[i];
+              numMatches && candState;
+              numMatches--, statMatch++, candState = candState->nextLevel)
+           {
+               if ((statMatch->typeIndex != candState->typeIndex) ||
+                   (statMatch->modIndex != candState->modIndex))
+                 break;
+           }
+         if (numMatches == 0) {
+             *leafStateRtn = candState;
+             UNLOCK_PROCESS;
+             return i;
+         }
+      }
+    *leafStateRtn = NULL;
+    UNLOCK_PROCESS;
+    return (TM_NO_MATCH);
+}
+
+static StatePtr TryCurrentTree(
+    TMComplexStateTree *stateTreePtr,
+    XtTM               tmRecPtr,
+    TMEventRec         *curEventPtr)
+{
+    StatePtr           candState = NULL, matchState = NULL;
+    TMContext          *contextPtr = GetContextPtr(tmRecPtr);
+    TMTypeMatch        typeMatch;
+    TMModifierMatch    modMatch;
+    int                        currIndex = -1;
+
+    /*
+     * we want the first sequence that both matches and has actions.
+     * we keep on looking till we find both
+     */
+    LOCK_PROCESS;
+    while ((currIndex =
+           MatchComplexBranch(*stateTreePtr,
+                              ++currIndex,
+                              (*contextPtr),
+                              &candState))
+          != TM_NO_MATCH) {
+       if (candState  != NULL) {
+           typeMatch  = TMGetTypeMatch(candState->typeIndex);
+           modMatch = TMGetModifierMatch(candState->modIndex);
+
+           /* does this state's index match? --> done */
+           if (MatchIncomingEvent(curEventPtr, typeMatch, modMatch))
+             {
+                 if (candState->actions) {
+                     UNLOCK_PROCESS;
+                     return candState;
+                 }
+                 else
+                   matchState = candState;
+             }
+           /* is this an event timer? */
+           if (typeMatch->eventType == _XtEventTimerEventType) {
+               StatePtr nextState = candState->nextLevel;
+
+               /* does the succeeding state match? */
+               if (nextState != NULL) {
+                   TMTypeMatch         nextTypeMatch;
+                   TMModifierMatch     nextModMatch;
+
+                   nextTypeMatch  = TMGetTypeMatch(nextState->typeIndex);
+                   nextModMatch = TMGetModifierMatch(nextState->modIndex);
+
+                   /* is it within the timeout? */
+                   if (MatchIncomingEvent(curEventPtr,
+                                          nextTypeMatch,
+                                          nextModMatch)) {
+                       XEvent *xev = curEventPtr->xev;
+                       unsigned long time = GetTime(tmRecPtr, xev);
+                       XtPerDisplay pd = _XtGetPerDisplay(xev->xany.display);
+                       unsigned long delta = pd->multi_click_time;
+
+                       if ((tmRecPtr->lastEventTime + delta) >= time) {
+                           if (nextState->actions) {
+                               UNLOCK_PROCESS;
+                               return candState;
+                           }
+                           else
+                             matchState = candState;
+                       }
+                   }
+               }
+           }
+       }
+    }
+    UNLOCK_PROCESS;
+    return matchState;
+}
+
+static void HandleComplexState(
+    Widget     w,
+    XtTM       tmRecPtr,
+    TMEventRec *curEventPtr)
+{
+    XtTranslations     xlations = tmRecPtr->translations;
+    TMContext          *contextPtr = GetContextPtr(tmRecPtr);
+    TMShortCard                i, matchTreeIndex = 0;
+    StatePtr           matchState = NULL, candState;
+    TMComplexStateTree         *stateTreePtr =
+      (TMComplexStateTree *)&xlations->stateTreeTbl[0];
+
+    LOCK_PROCESS;
+    for (i = 0;
+        i < xlations->numStateTrees;
+        i++, stateTreePtr++) {
+       /*
+        * some compilers sign extend Boolean bit fields so test for
+        * false |||
+        */
+       if (((*stateTreePtr)->isSimple == False) &&
+           (candState = TryCurrentTree(stateTreePtr,
+                                      tmRecPtr,
+                                      curEventPtr))) {
+           if (!matchState || candState->actions) {
+               matchTreeIndex = i;
+               matchState = candState;
+               if (candState->actions)
+                   break;
+           }
+       }
+    }
+    if (matchState == NULL){
+       /* couldn't find it... */
+       if (!Ignore(curEventPtr))
+         {
+             FreeContext(contextPtr);
+             HandleSimpleState(w, tmRecPtr, curEventPtr);
+         }
+    }
+    else {
+       TMBindData      bindData = (TMBindData) tmRecPtr->proc_table;
+       XtActionProc    *procs;
+       Widget          accelWidget;
+       TMTypeMatch     typeMatch;
+
+       typeMatch  = TMGetTypeMatch(matchState->typeIndex);
+
+       PushContext(contextPtr, matchState);
+       if (typeMatch->eventType == _XtEventTimerEventType) {
+           matchState = matchState->nextLevel;
+           PushContext(contextPtr, matchState);
+       }
+       tmRecPtr->lastEventTime = GetTime (tmRecPtr, curEventPtr->xev);
+
+       if (bindData->simple.isComplex) {
+           TMComplexBindProcs bindProcs =
+             TMGetComplexBindEntry(bindData, matchTreeIndex);
+           procs = bindProcs->procs;
+           accelWidget = bindProcs->widget;
+       }
+       else {
+           TMSimpleBindProcs bindProcs =
+             TMGetSimpleBindEntry(bindData, matchTreeIndex);
+           procs = bindProcs->procs;
+           accelWidget = NULL;
+       }
+       HandleActions(w,
+                     curEventPtr->xev,
+                     (TMSimpleStateTree)
+                     xlations->stateTreeTbl[matchTreeIndex],
+                     accelWidget,
+                     procs,
+                     matchState->actions);
+    }
+    UNLOCK_PROCESS;
+}
+
+
+void _XtTranslateEvent (
+    Widget w,
+    XEvent * event)
+{
+    XtTM       tmRecPtr = &w->core.tm;
+    TMEventRec         curEvent;
+    StatePtr   current_state = tmRecPtr->current_state;
+
+    XEventToTMEvent (event, &curEvent);
+
+    if (! tmRecPtr->translations) {
+        XtAppWarningMsg(XtWidgetToApplicationContext(w),
+                       XtNtranslationError,"nullTable",XtCXtToolkitError,
+                       "Can't translate event through NULL table",
+                       (String *)NULL, (Cardinal *)NULL);
+       return ;
+    }
+    if (current_state == NULL)
+         HandleSimpleState(w, tmRecPtr, &curEvent);
+    else
+         HandleComplexState(w, tmRecPtr, &curEvent);
+}
+
+
+/*ARGSUSED*/
+static StatePtr NewState(
+    TMParseStateTree stateTree,
+    TMShortCard        typeIndex,
+    TMShortCard        modIndex)
+{
+    StatePtr state = XtNew(StateRec);
+
+#ifdef TRACE_TM
+    LOCK_PROCESS;
+    _XtGlobalTM.numComplexStates++;
+    UNLOCK_PROCESS;
+#endif /* TRACE_TM */
+    state->typeIndex = typeIndex;
+    state->modIndex = modIndex;
+    state->nextLevel = NULL;
+    state->actions = NULL;
+    state->isCycleStart = state->isCycleEnd = False;
+    return state;
+}
+
+/*
+ * This routine is an iterator for state trees. If the func returns
+ * true then iteration is over.
+ */
+void _XtTraverseStateTree(
+    TMStateTree        tree,
+    _XtTraversalProc func,
+    XtPointer  data)
+{
+    TMComplexStateTree stateTree = (TMComplexStateTree)tree;
+    TMBranchHead       currBH;
+    TMShortCard                i;
+    StateRec           dummyStateRec, *dummyState = &dummyStateRec;
+    ActionRec          dummyActionRec, *dummyAction = &dummyActionRec;
+    Boolean            firstSimple = True;
+    StatePtr           currState;
+
+    /* first traverse the complex states */
+    if (stateTree->isSimple == False)
+      for (i = 0; i < stateTree->numComplexBranchHeads; i++) {
+         currState = stateTree->complexBranchHeadTbl[i];
+         for (; currState; currState = currState->nextLevel) {
+             if (func(currState, data))
+               return;
+             if (currState->isCycleEnd)
+               break;
+         }
+      }
+
+    /* now traverse the simple ones */
+    for (i = 0, currBH = stateTree->branchHeadTbl;
+        i < stateTree->numBranchHeads;
+        i++, currBH++)
+      {
+         if (currBH->isSimple && currBH->hasActions)
+           {
+               if (firstSimple)
+                 {
+                     XtBZero((char *) dummyState, sizeof(StateRec));
+                     XtBZero((char *) dummyAction, sizeof(ActionRec));
+                     dummyState->actions = dummyAction;
+                     firstSimple = False;
+                 }
+               dummyState->typeIndex = currBH->typeIndex;
+               dummyState->modIndex = currBH->modIndex;
+               dummyAction->idx = currBH->more;
+               if (func(dummyState, data))
+                 return;
+           }
+      }
+}
+
+static EventMask EventToMask(
+    TMTypeMatch     typeMatch,
+    TMModifierMatch modMatch)
+{
+    EventMask returnMask;
+    unsigned long eventType = typeMatch->eventType;
+
+    if (eventType == MotionNotify) {
+        Modifiers modifierMask = modMatch->modifierMask;
+        Modifiers tempMask;
+
+       returnMask = 0;
+        if (modifierMask == 0) {
+           if (modMatch->modifiers == AnyButtonMask)
+               return ButtonMotionMask;
+           else
+               return PointerMotionMask;
+       }
+        tempMask = modifierMask &
+           (Button1Mask | Button2Mask | Button3Mask
+            | Button4Mask | Button5Mask);
+        if (tempMask == 0)
+           return PointerMotionMask;
+        if (tempMask & Button1Mask)
+            returnMask |= Button1MotionMask;
+        if (tempMask & Button2Mask)
+            returnMask |= Button2MotionMask;
+        if (tempMask & Button3Mask)
+            returnMask |= Button3MotionMask;
+        if (tempMask & Button4Mask)
+            returnMask |= Button4MotionMask;
+        if (tempMask & Button5Mask)
+            returnMask |= Button5MotionMask;
+        return returnMask;
+    }
+    returnMask = _XtConvertTypeToMask(eventType);
+    if (returnMask == (StructureNotifyMask|SubstructureNotifyMask))
+       returnMask = StructureNotifyMask;
+    return returnMask;
+}
+
+/*ARGSUSED*/
+static void DispatchMappingNotify(
+    Widget widget,             /* will be NULL from _RefreshMapping */
+    XtPointer closure,         /* real Widget */
+    XtPointer call_data)       /* XEvent* */
+{
+    _XtTranslateEvent( (Widget)closure, (XEvent*)call_data);
+}
+
+
+/*ARGSUSED*/
+static void RemoveFromMappingCallbacks(
+    Widget widget,
+    XtPointer closure,         /* target widget */
+    XtPointer call_data)
+{
+    _XtRemoveCallback( &_XtGetPerDisplay(XtDisplay(widget))->mapping_callbacks,
+                      DispatchMappingNotify,
+                      closure
+                     );
+}
+
+static Boolean AggregateEventMask(
+    StatePtr   state,
+    XtPointer  data)
+{
+    LOCK_PROCESS;
+    *((EventMask *)data) |= EventToMask(TMGetTypeMatch(state->typeIndex),
+                                       TMGetModifierMatch(state->modIndex));
+    UNLOCK_PROCESS;
+    return False;
+}
+
+void _XtInstallTranslations(
+    Widget widget)
+{
+    XtTranslations xlations;
+    Cardinal   i;
+    TMStateTree        stateTree;
+    Boolean  mappingNotifyInterest = False;
+
+    xlations = widget->core.tm.translations;
+    if (xlations == NULL) return;
+
+    /*
+     * check for somebody stuffing the translations directly into the
+     * instance structure. We will end up being called again out of
+     * ComposeTranslations but we *should* have bindings by then
+     */
+    if (widget->core.tm.proc_table == NULL) {
+       _XtMergeTranslations(widget, NULL, XtTableReplace);
+       /*
+        * if we're realized then we'll be called out of
+        * ComposeTranslations
+        */
+       if (XtIsRealized(widget))
+         return;
+    }
+
+    xlations->eventMask = 0;
+    for (i = 0;
+        i < xlations->numStateTrees;
+        i++)
+      {
+         stateTree = xlations->stateTreeTbl[i];
+         _XtTraverseStateTree(stateTree,
+                           AggregateEventMask,
+                           (XtPointer)&xlations->eventMask);
+         mappingNotifyInterest |= stateTree->simple.mappingNotifyInterest;
+      }
+    /* double click needs to make sure that you have selected on both
+       button down and up. */
+
+    if (xlations->eventMask & ButtonPressMask)
+      xlations->eventMask |= ButtonReleaseMask;
+    if (xlations->eventMask & ButtonReleaseMask)
+      xlations->eventMask |= ButtonPressMask;
+
+    if (mappingNotifyInterest) {
+       XtPerDisplay pd = _XtGetPerDisplay(XtDisplay(widget));
+       if (pd->mapping_callbacks)
+           _XtAddCallbackOnce(&(pd->mapping_callbacks),
+                              DispatchMappingNotify,
+                              (XtPointer)widget);
+       else
+           _XtAddCallback(&(pd->mapping_callbacks),
+                          DispatchMappingNotify,
+                          (XtPointer)widget);
+
+       if (widget->core.destroy_callbacks != NULL)
+           _XtAddCallbackOnce( (InternalCallbackList *)
+                               &widget->core.destroy_callbacks,
+                               RemoveFromMappingCallbacks,
+                               (XtPointer)widget
+                              );
+       else
+           _XtAddCallback((InternalCallbackList *)
+                          &widget->core.destroy_callbacks,
+                          RemoveFromMappingCallbacks,
+                          (XtPointer)widget
+                         );
+    }
+    _XtBindActions(widget, (XtTM)&widget->core.tm);
+    _XtRegisterGrabs(widget);
+}
+
+void _XtRemoveTranslations(
+    Widget widget)
+{
+    Cardinal   i;
+    TMSimpleStateTree  stateTree;
+    Boolean            mappingNotifyInterest = False;
+    XtTranslations             xlations = widget->core.tm.translations;
+
+    if (xlations == NULL)
+      return;
+
+    for (i = 0;
+        i < xlations->numStateTrees;
+        i++)
+      {
+         stateTree = (TMSimpleStateTree)xlations->stateTreeTbl[i];
+         mappingNotifyInterest |= stateTree->mappingNotifyInterest;
+      }
+    if (mappingNotifyInterest)
+      RemoveFromMappingCallbacks(widget, (XtPointer)widget, NULL);
+}
+
+static void _XtUninstallTranslations(
+    Widget widget)
+{
+    XtTranslations     xlations = widget->core.tm.translations;
+
+    _XtUnbindActions(widget,
+                    xlations,
+                    (TMBindData)widget->core.tm.proc_table);
+    _XtRemoveTranslations(widget);
+    widget->core.tm.translations = NULL;
+    FreeContext((TMContext *)&widget->core.tm.current_state);
+}
+
+void _XtDestroyTMData(
+    Widget     widget)
+{
+    TMComplexBindData  cBindData;
+
+    _XtUninstallTranslations(widget);
+
+    if ((cBindData = (TMComplexBindData)widget->core.tm.proc_table)) {
+       if (cBindData->isComplex) {
+           ATranslations       aXlations, nXlations;
+
+           nXlations = (ATranslations) cBindData->accel_context;
+           while (nXlations){
+               aXlations = nXlations;
+               nXlations = nXlations->next;
+               XtFree((char *)aXlations);
+           }
+       }
+       XtFree((char *)cBindData);
+    }
+}
+
+/*** Public procedures ***/
+
+
+void XtUninstallTranslations(
+    Widget widget)
+{
+    EventMask  oldMask;
+    Widget hookobj;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    if (! widget->core.tm.translations) {
+       UNLOCK_APP(app);
+       return;
+    }
+    oldMask = widget->core.tm.translations->eventMask;
+    _XtUninstallTranslations(widget);
+    if (XtIsRealized(widget) && oldMask)
+       XSelectInput(XtDisplay(widget), XtWindow(widget),
+                    XtBuildEventMask(widget));
+    hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+       XtChangeHookDataRec call_data;
+
+       call_data.type = XtHuninstallTranslations;
+       call_data.widget = widget;
+       XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.changehook_callbacks,
+               (XtPointer)&call_data);
+    }
+    UNLOCK_APP(app);
+}
+
+XtTranslations _XtCreateXlations(
+    TMStateTree                *stateTrees,
+    TMShortCard                numStateTrees,
+    XtTranslations     first,
+    XtTranslations     second)
+{
+    XtTranslations     xlations;
+    TMShortCard i;
+
+    xlations = (XtTranslations)
+      __XtMalloc(sizeof(TranslationData) +
+              (numStateTrees-1) * sizeof(TMStateTree));
+#ifdef TRACE_TM
+    LOCK_PROCESS;
+    if (_XtGlobalTM.numTms == _XtGlobalTM.tmTblSize) {
+       _XtGlobalTM.tmTblSize += 16;
+       _XtGlobalTM.tmTbl = (XtTranslations *)
+         XtRealloc((char *)_XtGlobalTM.tmTbl,
+                  _XtGlobalTM.tmTblSize * sizeof(XtTranslations));
+    }
+    _XtGlobalTM.tmTbl[_XtGlobalTM.numTms++] = xlations;
+    UNLOCK_PROCESS;
+#endif /* TRACE_TM */
+
+    xlations->composers[0] = first;
+    xlations->composers[1] = second;
+    xlations->hasBindings = False;
+    xlations->operation = XtTableReplace;
+
+    for (i = 0;i < numStateTrees; i++)
+      {
+         xlations->stateTreeTbl[i] = (TMStateTree) stateTrees[i];
+         stateTrees[i]->simple.refCount++;
+      }
+    xlations->numStateTrees = numStateTrees;
+    xlations->eventMask = 0;
+    return xlations;
+}
+
+TMStateTree _XtParseTreeToStateTree(
+    TMParseStateTree   parseTree)
+{
+    TMSimpleStateTree  simpleTree;
+    unsigned int       tableSize;
+
+    if (parseTree->numComplexBranchHeads) {
+       TMComplexStateTree complexTree;
+
+       complexTree = XtNew(TMComplexStateTreeRec);
+       complexTree->isSimple = False;
+       tableSize = parseTree->numComplexBranchHeads * sizeof(StatePtr);
+       complexTree->complexBranchHeadTbl = (StatePtr *)
+         __XtMalloc(tableSize);
+       XtMemmove(complexTree->complexBranchHeadTbl,
+                 parseTree->complexBranchHeadTbl, tableSize);
+       complexTree->numComplexBranchHeads =
+         parseTree->numComplexBranchHeads;
+       simpleTree = (TMSimpleStateTree)complexTree;
+    }
+    else {
+       simpleTree = XtNew(TMSimpleStateTreeRec);
+       simpleTree->isSimple = True;
+    }
+    simpleTree->isAccelerator = parseTree->isAccelerator;
+    simpleTree->refCount = 0;
+    simpleTree->mappingNotifyInterest = parseTree->mappingNotifyInterest;
+
+    tableSize = parseTree->numBranchHeads * sizeof(TMBranchHeadRec);
+    simpleTree->branchHeadTbl = (TMBranchHead)
+      __XtMalloc(tableSize);
+    XtMemmove(simpleTree->branchHeadTbl, parseTree->branchHeadTbl, tableSize);
+    simpleTree->numBranchHeads = parseTree->numBranchHeads;
+
+    tableSize = parseTree->numQuarks * sizeof(XrmQuark);
+    simpleTree->quarkTbl = (XrmQuark *) __XtMalloc(tableSize);
+    XtMemmove(simpleTree->quarkTbl, parseTree->quarkTbl, tableSize);
+    simpleTree->numQuarks = parseTree->numQuarks;
+
+    return (TMStateTree)simpleTree;
+}
+
+static void FreeActions(
+    ActionPtr  actions)
+{
+    ActionPtr action;
+    TMShortCard i;
+    for (action = actions; action;) {
+       ActionPtr nextAction = action->next;
+       for (i = action->num_params; i;) {
+           XtFree( action->params[--i] );
+       }
+       XtFree( (char*)action->params );
+       XtFree((char*) action);
+       action = nextAction;
+    }
+}
+
+/*ARGSUSED*/
+static void AmbigActions(
+    EventSeqPtr        initialEvent,
+    StatePtr   *state,
+    TMParseStateTree stateTree)
+{
+    String     params[3];
+    Cardinal   numParams = 0;
+
+    params[numParams++] = _XtPrintEventSeq(initialEvent, NULL);
+    params[numParams++] = _XtPrintActions((*state)->actions,
+                                         stateTree->quarkTbl);
+    XtWarningMsg (XtNtranslationError,"oldActions",XtCXtToolkitError,
+                 "Previous entry was: %s %s", params, &numParams);
+    XtFree((char *)params[0]);
+    XtFree((char *)params[1]);
+    numParams = 0;
+    params[numParams++]  = _XtPrintActions(initialEvent->actions,
+                                          stateTree->quarkTbl);
+    XtWarningMsg (XtNtranslationError,"newActions",XtCXtToolkitError,
+                 "New actions are:%s", params, &numParams);
+    XtFree((char *)params[0]);
+    XtWarningMsg (XtNtranslationError,"ambiguousActions",
+                 XtCXtToolkitError,
+                 "Overriding earlier translation manager actions.",
+                 (String *)NULL, (Cardinal *)NULL);
+
+    FreeActions((*state)->actions);
+    (*state)->actions = NULL;
+}
+
+
+void _XtAddEventSeqToStateTree(
+    EventSeqPtr        eventSeq,
+    TMParseStateTree   stateTree)
+{
+    StatePtr           *state;
+    EventSeqPtr                initialEvent = eventSeq;
+    TMBranchHead       branchHead;
+    TMShortCard                idx, modIndex, typeIndex;
+
+    if (eventSeq == NULL) return;
+
+    /* note that all states in the event seq passed in start out null */
+    /* we fill them in with the matching state as we traverse the list */
+
+    /*
+     * We need to free the parser data structures !!!
+     */
+
+    typeIndex = _XtGetTypeIndex(&eventSeq->event);
+    modIndex = _XtGetModifierIndex(&eventSeq->event);
+    idx = GetBranchHead(stateTree, typeIndex, modIndex, False);
+    branchHead = &stateTree->branchHeadTbl[idx];
+
+    /*
+     * Need to check for pre-existing actions with same lhs |||
+     */
+
+    /*
+     * Check for optimized case. Don't assume that the eventSeq has actions.
+     */
+    if (!eventSeq->next &&
+        eventSeq->actions &&
+       !eventSeq->actions->next &&
+       !eventSeq->actions->num_params)
+      {
+         if (eventSeq->event.eventType == MappingNotify)
+           stateTree->mappingNotifyInterest = True;
+         branchHead->hasActions = True;
+         branchHead->more = eventSeq->actions->idx;
+         FreeActions(eventSeq->actions);
+         eventSeq->actions = NULL;
+         return;
+      }
+
+    branchHead->isSimple = False;
+    if (!eventSeq->next)
+      branchHead->hasActions = True;
+    branchHead->more = GetComplexBranchIndex(stateTree, typeIndex, modIndex);
+    state = &stateTree->complexBranchHeadTbl[TMBranchMore(branchHead)];
+
+    for (;;) {
+       *state = NewState(stateTree, typeIndex, modIndex);
+
+       if (eventSeq->event.eventType == MappingNotify)
+           stateTree->mappingNotifyInterest = True;
+
+       /* *state now points at state record matching event */
+       eventSeq->state = *state;
+
+       if (eventSeq->actions != NULL) {
+           if ((*state)->actions != NULL)
+             AmbigActions(initialEvent, state, stateTree);
+           (*state)->actions = eventSeq->actions;
+#ifdef TRACE_TM
+           LOCK_PROCESS
+           _XtGlobalTM.numComplexActions++;
+           UNLOCK_PROCESS;
+#endif /* TRACE_TM */
+       }
+
+       if (((eventSeq = eventSeq->next) == NULL) || (eventSeq->state))
+         break;
+
+       state = &(*state)->nextLevel;
+       typeIndex = _XtGetTypeIndex(&eventSeq->event);
+       modIndex = _XtGetModifierIndex(&eventSeq->event);
+       LOCK_PROCESS;
+       if (!TMNewMatchSemantics()) {
+           /*
+            * force a potential empty entry into the branch head
+            * table in order to emulate old matching behavior
+            */
+           (void) GetBranchHead(stateTree, typeIndex, modIndex, True);
+       }
+       UNLOCK_PROCESS;
+    }
+
+    if (eventSeq && eventSeq->state) {
+       /* we've been here before... must be a cycle in the event seq. */
+       branchHead->hasCycles = True;
+       (*state)->nextLevel = eventSeq->state;
+       eventSeq->state->isCycleStart = True;
+       (*state)->isCycleEnd = TRUE;
+    }
+}
+
+
+/*
+ * Internal Converter for merging. Old and New must both be valid xlations
+ */
+
+/*ARGSUSED*/
+Boolean _XtCvtMergeTranslations(
+    Display    *dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr from,
+    XrmValuePtr to,
+    XtPointer  *closure_ret)
+{
+    XtTranslations     first, second, xlations;
+    TMStateTree                *stateTrees, stackStateTrees[16];
+    TMShortCard                numStateTrees, i;
+
+    if (*num_args != 0)
+       XtWarningMsg("invalidParameters","mergeTranslations",XtCXtToolkitError,
+             "MergeTM to TranslationTable needs no extra arguments",
+               (String *)NULL, (Cardinal *)NULL);
+
+    if (to->addr != NULL && to->size < sizeof(XtTranslations)) {
+       to->size = sizeof(XtTranslations);
+       return False;
+    }
+
+    first = ((TMConvertRec*)from->addr)->old;
+    second = ((TMConvertRec*)from->addr)->new;
+
+    numStateTrees = first->numStateTrees + second->numStateTrees;
+
+    stateTrees = (TMStateTree *)
+      XtStackAlloc(numStateTrees * sizeof(TMStateTree), stackStateTrees);
+
+    for (i = 0; i < first->numStateTrees; i++)
+      stateTrees[i] = first->stateTreeTbl[i];
+    for (i = 0; i < second->numStateTrees; i++)
+      stateTrees[i + first->numStateTrees] = second->stateTreeTbl[i];
+
+    xlations = _XtCreateXlations(stateTrees, numStateTrees, first, second);
+
+    if (to->addr != NULL) {
+       *(XtTranslations*)to->addr = xlations;
+    }
+    else {
+       static XtTranslations staticStateTable;
+       staticStateTable = xlations;
+       to->addr= (XPointer)&staticStateTable;
+       to->size = sizeof(XtTranslations);
+    }
+
+    XtStackFree((XtPointer)stateTrees, (XtPointer)stackStateTrees);
+    return True;
+}
+
+
+static XtTranslations MergeThem(
+    Widget             dest,
+    XtTranslations     first,
+    XtTranslations     second)
+{
+    XtCacheRef                 cache_ref;
+    static XrmQuark    from_type = NULLQUARK, to_type;
+    XrmValue           from, to;
+    TMConvertRec       convert_rec;
+    XtTranslations     newTable;
+
+    LOCK_PROCESS;
+    if (from_type == NULLQUARK) {
+       from_type = XrmPermStringToQuark(_XtRStateTablePair);
+       to_type = XrmPermStringToQuark(XtRTranslationTable);
+    }
+    UNLOCK_PROCESS;
+    from.addr = (XPointer)&convert_rec;
+    from.size = sizeof(TMConvertRec);
+    to.addr = (XPointer)&newTable;
+    to.size = sizeof(XtTranslations);
+    convert_rec.old = first;
+    convert_rec.new = second;
+
+    LOCK_PROCESS;
+    if (! _XtConvert(dest, from_type, &from, to_type, &to, &cache_ref)) {
+       UNLOCK_PROCESS;
+       return NULL;
+    }
+    UNLOCK_PROCESS;
+
+#ifndef REFCNT_TRANSLATIONS
+
+    if (cache_ref)
+       XtAddCallback(dest, XtNdestroyCallback,
+                     XtCallbackReleaseCacheRef, (XtPointer)cache_ref);
+
+#endif
+
+    return newTable;
+}
+
+/*
+ * Unmerge will recursively traverse the xlation compose tree and
+ * generate a new xlation that is the result of all instances of
+ * xlations being removed. It currently doesn't differentiate between
+ * the potential that an xlation will be both an accelerator and
+ * normal. This is not supported by the spec anyway.
+ */
+static XtTranslations UnmergeTranslations(
+    Widget             widget,
+    XtTranslations     xlations,
+    XtTranslations     unmergeXlations,
+    TMShortCard                currIndex,
+    TMComplexBindProcs oldBindings,
+    TMShortCard                numOldBindings,
+    TMComplexBindProcs newBindings,
+    TMShortCard                *numNewBindingsRtn)
+
+{
+    XtTranslations first, second, result;
+
+    if (!xlations || (xlations == unmergeXlations))
+      return NULL;
+
+    if (xlations->composers[0]) {
+       first = UnmergeTranslations(widget, xlations->composers[0],
+                                   unmergeXlations,  currIndex,
+                                   oldBindings, numOldBindings,
+                                   newBindings, numNewBindingsRtn);
+    }
+    else
+      first = NULL;
+
+    if (xlations->composers[1]) {
+       second = UnmergeTranslations(widget, xlations->composers[1],
+                                    unmergeXlations,
+                                    currIndex +
+                                    xlations->composers[0]->numStateTrees,
+                                    oldBindings, numOldBindings,
+                                    newBindings, numNewBindingsRtn);
+    }
+    else
+      second = NULL;
+
+    if (first || second) {
+       if (first && second) {
+           if ((first != xlations->composers[0]) ||
+               (second != xlations->composers[1]))
+             result = MergeThem(widget, first, second);
+           else result = xlations;
+       }
+       else {
+           if (first)
+             result = first;
+           else
+             result = second;
+       }
+    } else { /* only update for leaf nodes */
+       if (numOldBindings) {
+           Cardinal    i;
+           for (i = 0; i < xlations->numStateTrees; i++) {
+               if (xlations->stateTreeTbl[i]->simple.isAccelerator)
+                   newBindings[*numNewBindingsRtn] =
+                       oldBindings[currIndex + i];
+               (*numNewBindingsRtn)++;
+           }
+       }
+       result = xlations;
+    }
+    return result;
+}
+
+typedef struct {
+    XtTranslations xlations;
+    TMComplexBindProcs bindings;
+}MergeBindRec, *MergeBind;
+
+static XtTranslations MergeTranslations(
+    Widget             widget,
+    XtTranslations     oldXlations,
+    XtTranslations     newXlations,
+    _XtTranslateOp     operation,
+    Widget             source,
+    TMComplexBindProcs oldBindings,
+    TMComplexBindProcs newBindings,
+    TMShortCard                *numNewRtn)
+{
+    XtTranslations      newTable = NULL, xlations;
+    TMComplexBindProcs bindings;
+    TMShortCard                i, j;
+    TMStateTree        *treePtr;
+    TMShortCard                numNew = *numNewRtn;
+    MergeBindRec       bindPair[2];
+
+    /* If the new translation has an accelerator context then pull it
+     * off and pass it and the real xlations in to the caching merge
+     * routine.
+     */
+    if (newXlations->hasBindings) {
+       xlations = ((ATranslations) newXlations)->xlations;
+       bindings = (TMComplexBindProcs)
+           &((ATranslations) newXlations)->bindTbl[0];
+    }
+    else {
+       xlations = newXlations;
+       bindings = NULL;
+    }
+    switch(operation) {
+      case XtTableReplace:
+       newTable = bindPair[0].xlations = xlations;
+       bindPair[0].bindings = bindings;
+       bindPair[1].xlations = NULL;
+       bindPair[1].bindings = NULL;
+       break;
+      case XtTableAugment:
+       bindPair[0].xlations = oldXlations;
+       bindPair[0].bindings = oldBindings;
+       bindPair[1].xlations = xlations;
+       bindPair[1].bindings = bindings;
+       newTable = NULL;
+       break;
+      case XtTableOverride:
+       bindPair[0].xlations = xlations;
+       bindPair[0].bindings = bindings;
+       bindPair[1].xlations = oldXlations;
+       bindPair[1].bindings = oldBindings;
+       newTable = NULL;
+       break;
+    }
+    if (!newTable)
+      newTable = MergeThem(widget, bindPair[0].xlations, bindPair[1].xlations);
+
+    for (i = 0, numNew = 0; i < 2; i++) {
+       if (bindPair[i].xlations)
+         for (j = 0; j < bindPair[i].xlations->numStateTrees; j++, numNew++) {
+             if (bindPair[i].xlations->stateTreeTbl[j]->simple.isAccelerator) {
+                 if (bindPair[i].bindings)
+                   newBindings[numNew] = bindPair[i].bindings[j];
+                 else {
+                     newBindings[numNew].widget = source;
+                     newBindings[numNew].aXlations =
+                       bindPair[i].xlations;
+                 }
+               }
+         }
+    }
+    *numNewRtn = numNew;
+    treePtr = &newTable->stateTreeTbl[0];
+    for (i = 0; i < newTable->numStateTrees; i++, treePtr++)
+      (*treePtr)->simple.refCount++;
+    return newTable;
+}
+
+static TMBindData MakeBindData(
+    TMComplexBindProcs bindings,
+    TMShortCard                numBindings,
+    TMBindData         oldBindData)
+{
+    TMLongCard         bytes;
+    TMShortCard                i;
+    Boolean            isComplex;
+    TMBindData         bindData;
+
+    if (numBindings == 0)
+      return NULL;
+    for (i = 0; i < numBindings; i++)
+      if (bindings[i].widget)
+       break;
+    isComplex = (i < numBindings);
+    if (isComplex)
+      bytes = (sizeof(TMComplexBindDataRec) +
+              ((numBindings - 1) *
+               sizeof(TMComplexBindProcsRec)));
+    else
+      bytes = (sizeof(TMSimpleBindDataRec) +
+              ((numBindings - 1) *
+               sizeof(TMSimpleBindProcsRec)));
+
+    bindData = (TMBindData) __XtCalloc(sizeof(char), bytes);
+    bindData->simple.isComplex = isComplex;
+    if (isComplex) {
+       TMComplexBindData cBindData = (TMComplexBindData)bindData;
+       /*
+        * If there were any accelerator contexts in the old bindData
+        * then propagate them to the new one.
+        */
+       if (oldBindData && oldBindData->simple.isComplex)
+           cBindData->accel_context =
+               ((TMComplexBindData) oldBindData)->accel_context;
+       XtMemmove((char *)&cBindData->bindTbl[0], (char *)bindings,
+                 numBindings * sizeof(TMComplexBindProcsRec));
+    }
+    return bindData;
+}
+
+/*
+ * This routine is the central clearinghouse for merging translations
+ * into a widget. It takes care of preping the action bindings for
+ * realize time and calling the converter or doing a straight merge if
+ * the destination is empty.
+ */
+static Boolean ComposeTranslations(
+    Widget dest,
+    _XtTranslateOp operation,
+    Widget source,
+    XtTranslations newXlations)
+{
+    XtTranslations     newTable, oldXlations;
+    XtTranslations     accNewXlations;
+    EventMask          oldMask = 0;
+    TMBindData         bindData;
+    TMComplexBindProcs oldBindings = NULL;
+    TMShortCard                numOldBindings = 0, numNewBindings = 0, numBytes;
+    TMComplexBindProcsRec stackBindings[16], *newBindings;
+
+    /*
+     * how should we be handling the refcount decrement for the
+     * replaced translation table ???
+     */
+    if (!newXlations)
+      {
+         XtAppWarningMsg(XtWidgetToApplicationContext(dest),
+                         XtNtranslationError,"nullTable",XtCXtToolkitError,
+                         "table to (un)merge must not be null",
+                         (String *)NULL, (Cardinal *)NULL);
+         return False;
+      }
+
+    accNewXlations = newXlations;
+    newXlations = ((newXlations->hasBindings)
+                  ? ((ATranslations)newXlations)->xlations
+                  : newXlations);
+
+    if (!(oldXlations = dest->core.tm.translations))
+      operation = XtTableReplace;
+
+    /*
+     * try to avoid generation of duplicate state trees. If the source
+     * isn't simple (1 state Tree) then it's too much hassle
+     */
+    if (((operation == XtTableAugment) ||
+        (operation == XtTableOverride)) &&
+       (newXlations->numStateTrees == 1)) {
+       Cardinal        i;
+       for (i = 0; i < oldXlations->numStateTrees; i++)
+         if (oldXlations->stateTreeTbl[i] ==
+             newXlations->stateTreeTbl[0])
+           break;
+       if (i < oldXlations->numStateTrees) {
+           if (operation == XtTableAugment) {
+               /*
+                * we don't need to do anything since it's already
+                * there
+                */
+               return True;
+           }
+           else {/* operation == XtTableOverride */
+               /*
+                * We'll get rid of the duplicate trees throughout the
+                * and leave it with a pruned translation table. This
+                * will only work if the same table has been merged
+                * into this table (or one of it's composers
+                */
+               _XtUnmergeTranslations(dest, newXlations);
+               /*
+                * reset oldXlations so we're back in sync
+                */
+               if (!(oldXlations = dest->core.tm.translations))
+                 operation = XtTableReplace;
+           }
+       }
+    }
+
+    bindData = (TMBindData) dest->core.tm.proc_table;
+    if (bindData) {
+       numOldBindings = (oldXlations ? oldXlations->numStateTrees : 0);
+       if (bindData->simple.isComplex)
+           oldBindings = &((TMComplexBindData)bindData)->bindTbl[0];
+       else
+           oldBindings = (TMComplexBindProcs)
+               (&((TMSimpleBindData)bindData)->bindTbl[0]);
+    }
+
+    numBytes =(((oldXlations ? oldXlations->numStateTrees : 0)
+               + newXlations->numStateTrees) * sizeof(TMComplexBindProcsRec));
+    newBindings = (TMComplexBindProcs) XtStackAlloc(numBytes,  stackBindings);
+    XtBZero((char *)newBindings, numBytes);
+
+    if (operation == XtTableUnmerge) {
+       newTable = UnmergeTranslations(dest,
+                                      oldXlations,
+                                      newXlations,
+                                      0,
+                                      oldBindings, numOldBindings,
+                                      newBindings, &numNewBindings);
+#ifdef DEBUG
+       /* check for no match for unmerge */
+       if (newTable == oldXlations) {
+           XtWarning("attempt to unmerge invalid table");
+           XtStackFree((char *)newBindings, (char *)stackBindings);
+           return(newTable != NULL);
+       }
+#endif /* DEBUG */
+    }
+    else {
+       newTable = MergeTranslations(dest,
+                                    oldXlations,
+                                    accNewXlations,
+                                    operation,
+                                    source,
+                                    oldBindings,
+                                    newBindings,
+                                    &numNewBindings);
+    }
+    if (XtIsRealized(dest)) {
+       oldMask = 0;
+       if (oldXlations)
+           oldMask = oldXlations->eventMask;
+       _XtUninstallTranslations(dest);
+    }
+
+    dest->core.tm.proc_table =
+      (XtActionProc *) MakeBindData(newBindings, numNewBindings, bindData);
+
+    if (bindData) XtFree((char *)bindData);
+
+    dest->core.tm.translations = newTable;
+
+    if (XtIsRealized(dest)) {
+       EventMask mask = 0;
+       _XtInstallTranslations(dest);
+       if (newTable)
+           mask = newTable->eventMask;
+       if (mask != oldMask)
+           XSelectInput(XtDisplay(dest), XtWindow(dest),
+                        XtBuildEventMask(dest));
+    }
+    XtStackFree((XtPointer)newBindings, (XtPointer)stackBindings);
+    return(newTable != NULL);
+}
+
+/*
+ * If a GetValues is done on a translation resource that contains
+ * accelerators we need to return the accelerator context in addition
+ * to the pure translations.  Since this means returning memory that
+ * the client controlls but we still own, we will track the "headers"
+ * that we return (via a linked list pointed to from the bindData) and
+ * free it at destroy time.
+ */
+XtTranslations _XtGetTranslationValue(
+    Widget     w)
+{
+    XtTM               tmRecPtr = (XtTM) &w->core.tm;
+    ATranslations      *aXlationsPtr;
+    TMComplexBindData  cBindData = (TMComplexBindData) tmRecPtr->proc_table;
+    XtTranslations     xlations = tmRecPtr->translations;
+
+    if (!xlations || !cBindData || !cBindData->isComplex)
+       return xlations;
+
+    /* Walk the list looking to see if we already have generated a
+     * header for the currently installed translations.  If we have,
+     * just return that header.  Otherwise create a new header.
+     */
+    for (aXlationsPtr = (ATranslations *) &cBindData->accel_context;
+        *aXlationsPtr && (*aXlationsPtr)->xlations != xlations;
+        aXlationsPtr = &(*aXlationsPtr)->next)
+       ;
+    if (*aXlationsPtr)
+       return (XtTranslations) *aXlationsPtr;
+    else {
+       /* create a new aXlations context */
+       ATranslations   aXlations;
+       Cardinal        numBindings = xlations->numStateTrees;
+
+       (*aXlationsPtr) = aXlations = (ATranslations)
+           __XtMalloc(sizeof(ATranslationData) +
+                    (numBindings - 1) * sizeof(TMComplexBindProcsRec));
+
+       aXlations->hasBindings = True;
+       aXlations->xlations = xlations;
+       aXlations->next = NULL;
+       XtMemmove((char *) &aXlations->bindTbl[0],
+                 (char *) &cBindData->bindTbl[0],
+                 numBindings * sizeof(TMComplexBindProcsRec));
+       return (XtTranslations) aXlations;
+    }
+}
+
+
+/*ARGSUSED*/
+static void RemoveStateTree(
+    TMStateTree        tree)
+{
+#ifdef REFCNT_TRANSLATIONS
+    TMComplexStateTree stateTree = (TMComplexStateTree)tree;
+
+    if (--stateTree->refCount == 0) {
+       /*
+        * should we free/refcount the match recs ?
+        */
+       if (!stateTree->isSimple)  {
+           StatePtr    currState, nextState;
+           TMShortCard i;
+           for (i = 0; i < stateTree->numComplexBranchHeads; i++) {
+               currState =
+                 nextState =
+                   stateTree->complexBranchHeadTbl[i];
+               for (; nextState;){
+                   FreeActions(currState->actions);
+                   currState->actions = NULL;
+                   if (!currState->isCycleEnd)
+                     nextState = currState->nextLevel;
+                   else
+                     nextState = NULL;
+                   XtFree( (char*)currState );
+               }
+           }
+           XtFree((char*)stateTree->complexBranchHeadTbl);
+       }
+       XtFree((char*)stateTree->branchHeadTbl);
+       XtFree((char*)stateTree);
+    }
+#endif /* REFCNT_TRANSLATIONS */
+}
+
+void _XtRemoveStateTreeByIndex(
+    XtTranslations     xlations,
+    TMShortCard        i)
+{
+    TMStateTree                *stateTrees = xlations->stateTreeTbl;
+
+    RemoveStateTree(stateTrees[i]);
+    xlations->numStateTrees--;
+
+    for (; i < xlations->numStateTrees; i++)
+      {
+         stateTrees[i] = stateTrees[i+1];
+      }
+}
+
+/* ARGSUSED */
+void _XtFreeTranslations(
+    XtAppContext app,
+    XrmValuePtr        toVal,
+    XtPointer  closure,
+    XrmValuePtr        args,
+    Cardinal   *num_args)
+{
+    XtTranslations     xlations;
+    int        i;
+
+    if (*num_args != 0)
+       XtAppWarningMsg(app,
+         "invalidParameters","freeTranslations",XtCXtToolkitError,
+          "Freeing XtTranslations requires no extra arguments",
+         (String *)NULL, (Cardinal *)NULL);
+
+    xlations = *(XtTranslations*)toVal->addr;
+    for (i = 0; i < (int)xlations->numStateTrees; i++)
+      RemoveStateTree(xlations->stateTreeTbl[i]);
+    XtFree((char *)xlations);
+}
+
+/*  The spec is not clear on when actions specified in accelerators are bound;
+ *  Bind them at Realize the same as translations
+ */
+void XtInstallAccelerators(
+    Widget destination, Widget source)
+{
+    XtTranslations     aXlations;
+    _XtTranslateOp     op;
+    String             buf;
+    WIDGET_TO_APPCON(destination);
+
+    /*
+     * test that it was parsed as an accelarator table. Even though
+     * there doesn't need to be a distinction it makes life easier if
+     * we honor the spec implication that aXlations is an accelerator
+     */
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    if ((!XtIsWidget(source)) ||
+       ((aXlations = source->core.accelerators) == NULL) ||
+       (aXlations->stateTreeTbl[0]->simple.isAccelerator == False)) {
+       UNLOCK_PROCESS;
+       UNLOCK_APP(app);
+       return;
+    }
+
+    aXlations = source->core.accelerators;
+    op = aXlations->operation;
+
+    if (ComposeTranslations(destination, op, source, aXlations) &&
+       (XtClass(source)->core_class.display_accelerator != NULL)) {
+
+       buf = _XtPrintXlations(destination, aXlations, source, False);
+       (*(XtClass(source)->core_class.display_accelerator))(source,buf);
+       XtFree(buf);
+    }
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+}
+
+void XtInstallAllAccelerators(
+    Widget destination,
+    Widget source)
+{
+    Cardinal i;
+    CompositeWidget cw;
+    WIDGET_TO_APPCON(destination);
+
+    /* Recurse down normal children */
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    if (XtIsComposite(source)) {
+        cw = (CompositeWidget) source;
+        for (i = 0; i < cw->composite.num_children; i++) {
+            XtInstallAllAccelerators(destination,cw->composite.children[i]);
+        }
+    }
+
+    /* Recurse down popup children */
+    if (XtIsWidget(source)) {
+        for (i = 0; i < source->core.num_popups; i++) {
+            XtInstallAllAccelerators(destination,source->core.popup_list[i]);
+        }
+    }
+    /* Finally, apply procedure to this widget */
+    XtInstallAccelerators(destination,source);
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+}
+
+#if 0 /* dead code */
+static _XtTranslateOp _XtGetTMOperation(
+    XtTranslations xlations)
+{
+    return ((xlations->hasBindings)
+           ? ((ATranslations)xlations)->xlations->operation
+           : xlations->operation);
+}
+#endif
+
+void XtAugmentTranslations(
+    Widget widget,
+    XtTranslations new)
+{
+    Widget hookobj;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    (void)ComposeTranslations(widget, XtTableAugment, (Widget)NULL, new);
+    hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+       XtChangeHookDataRec call_data;
+
+       call_data.type = XtHaugmentTranslations;
+       call_data.widget = widget;
+       XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.changehook_callbacks,
+               (XtPointer)&call_data);
+    }
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+}
+
+void XtOverrideTranslations(
+    Widget widget,
+    XtTranslations new)
+{
+    Widget hookobj;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    (void) ComposeTranslations(widget, XtTableOverride, (Widget)NULL, new);
+    hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+       XtChangeHookDataRec call_data;
+
+       call_data.type = XtHoverrideTranslations;
+       call_data.widget = widget;
+       XtCallCallbackList(hookobj,
+               ((HookObject)hookobj)->hooks.changehook_callbacks,
+               (XtPointer)&call_data);
+    }
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+}
+
+void _XtMergeTranslations(
+    Widget     widget,
+    XtTranslations newXlations,
+    _XtTranslateOp op)
+{
+    if (!newXlations){
+       if (!widget->core.tm.translations)
+         return;
+       else {
+         newXlations = widget->core.tm.translations;
+         widget->core.tm.translations = NULL;
+      }
+    }
+    (void) ComposeTranslations(widget,
+                            op,
+                            (Widget)NULL,
+                            newXlations);
+}
+
+void _XtUnmergeTranslations(
+   Widget              widget,
+    XtTranslations     xlations)
+{
+    ComposeTranslations(widget, XtTableUnmerge, (Widget)NULL, xlations);
+}
diff --git a/src/Threads.c b/src/Threads.c
new file mode 100644 (file)
index 0000000..7ae9e18
--- /dev/null
@@ -0,0 +1,421 @@
+/************************************************************
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+********************************************************/
+
+/*
+
+Copyright 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+
+#ifdef XTHREADS
+
+#define xmalloc __XtMalloc
+#define xfree XtFree
+#include <X11/Xthreads.h>
+
+#ifndef NDEBUG
+#define NDEBUG
+#endif
+#include <assert.h>
+#include <stdio.h>
+
+typedef struct _ThreadStack {
+    unsigned int size;
+    int sp;
+    struct _Tstack {
+       xthread_t t;
+       xcondition_t c;
+    } *st;
+} ThreadStack;
+
+typedef struct _LockRec {
+    xmutex_t mutex;
+    int level;
+    ThreadStack stack;
+#ifndef _XMUTEX_NESTS
+    xthread_t holder;
+    xcondition_t cond;
+#endif
+} LockRec;
+
+
+#define STACK_INCR 16
+
+static LockPtr process_lock = NULL;
+
+static void
+InitProcessLock(void)
+{
+    if(!process_lock) {
+       process_lock = XtNew(LockRec);
+       process_lock->mutex = xmutex_malloc();
+       xmutex_init(process_lock->mutex);
+       process_lock->level = 0;
+#ifndef _XMUTEX_NESTS
+       process_lock->cond = xcondition_malloc();
+       xcondition_init(process_lock->cond);
+       xthread_clear_id(process_lock->holder);
+#endif
+    }
+}
+
+static void
+ProcessLock(void)
+{
+#ifdef _XMUTEX_NESTS
+    xmutex_lock(process_lock->mutex);
+    process_lock->level++;
+#else
+    xthread_t this_thread = xthread_self();
+
+    xmutex_lock(process_lock->mutex);
+
+    if (!xthread_have_id(process_lock->holder)) {
+       process_lock->holder = this_thread;
+       xmutex_unlock(process_lock->mutex);
+       return;
+    }
+
+    if (xthread_equal(process_lock->holder,this_thread)) {
+       process_lock->level++;
+       xmutex_unlock(process_lock->mutex);
+       return;
+    }
+
+    while(xthread_have_id(process_lock->holder))
+       xcondition_wait(process_lock->cond, process_lock->mutex);
+
+    process_lock->holder = this_thread;
+    assert(xthread_equal(process_lock->holder, this_thread));
+    xmutex_unlock(process_lock->mutex);
+#endif
+}
+
+static void
+ProcessUnlock(void)
+{
+#ifdef _XMUTEX_NESTS
+    process_lock->level--;
+    xmutex_unlock(process_lock->mutex);
+#else
+    xmutex_lock(process_lock->mutex);
+    assert(xthread_equal(process_lock->holder, xthread_self()));
+    if (process_lock->level != 0) {
+       process_lock->level--;
+       xmutex_unlock(process_lock->mutex);
+       return;
+    }
+
+    xthread_clear_id(process_lock->holder);
+    xcondition_signal(process_lock->cond);
+
+    xmutex_unlock(process_lock->mutex);
+#endif
+}
+
+
+static void
+AppLock(XtAppContext app)
+{
+    LockPtr app_lock = app->lock_info;
+#ifdef _XMUTEX_NESTS
+    xmutex_lock(app_lock->mutex);
+    app_lock->level++;
+#else
+    xthread_t self = xthread_self();
+    xmutex_lock(app_lock->mutex);
+    if (!xthread_have_id(app_lock->holder)) {
+       app_lock->holder = self;
+       assert(xthread_equal(app_lock->holder, self));
+       xmutex_unlock(app_lock->mutex);
+       return;
+    }
+    if (xthread_equal(app_lock->holder, self)) {
+       app_lock->level++;
+       xmutex_unlock(app_lock->mutex);
+       return;
+    }
+    while(xthread_have_id(app_lock->holder)) {
+       xcondition_wait(app_lock->cond, app_lock->mutex);
+    }
+    app_lock->holder = self;
+    assert(xthread_equal(app_lock->holder, self));
+    xmutex_unlock(app_lock->mutex);
+#endif
+}
+
+static void
+AppUnlock(XtAppContext app)
+{
+    LockPtr app_lock = app->lock_info;
+#ifdef _XMUTEX_NESTS
+    app_lock->level--;
+    xmutex_unlock(app_lock->mutex);
+#else
+    xthread_t self;
+
+    self = xthread_self();
+    xmutex_lock(app_lock->mutex);
+    assert(xthread_equal(app_lock->holder, self));
+    if (app_lock->level != 0) {
+       app_lock->level--;
+       xmutex_unlock(app_lock->mutex);
+       return;
+    }
+    xthread_clear_id(app_lock->holder);
+    xcondition_signal(app_lock->cond);
+    xmutex_unlock(app_lock->mutex);
+#endif
+}
+
+static void
+YieldAppLock(
+    XtAppContext app,
+    Boolean* push_thread,
+    Boolean* pushed_thread,
+    int* level)
+{
+    LockPtr app_lock = app->lock_info;
+    xthread_t self = xthread_self();
+#ifndef _XMUTEX_NESTS
+    xmutex_lock(app_lock->mutex);
+    assert(xthread_equal(app_lock->holder, self));
+#endif
+    *level = app_lock->level;
+    if (*push_thread) {
+       *push_thread = FALSE;
+       *pushed_thread = TRUE;
+
+       if(app_lock->stack.sp == (int)app_lock->stack.size - 1) {
+           unsigned ii;
+           app_lock->stack.st = (struct _Tstack *)
+               XtRealloc ((char *)app_lock->stack.st,
+               (app_lock->stack.size + STACK_INCR) * sizeof (struct _Tstack));
+           ii = app_lock->stack.size;
+           app_lock->stack.size += STACK_INCR;
+           for ( ; ii < app_lock->stack.size; ii++) {
+               app_lock->stack.st[ii].c = xcondition_malloc();
+               xcondition_init(app_lock->stack.st[ii].c);
+           }
+       }
+       app_lock->stack.st[++(app_lock->stack.sp)].t = self;
+    }
+#ifdef _XMUTEX_NESTS
+    while (app_lock->level > 0) {
+       app_lock->level--;
+       xmutex_unlock(app_lock->mutex);
+    }
+#else
+    xcondition_signal(app_lock->cond);
+    app_lock->level = 0;
+    xthread_clear_id(app_lock->holder);
+    xmutex_unlock(app_lock->mutex);
+#endif
+}
+
+static void
+RestoreAppLock(
+    XtAppContext app,
+    int level,
+    Boolean* pushed_thread)
+{
+    LockPtr app_lock = app->lock_info;
+    xthread_t self = xthread_self();
+    xmutex_lock(app_lock->mutex);
+#ifdef _XMUTEX_NESTS
+    app_lock->level++;
+#else
+    while(xthread_have_id(app_lock->holder)) {
+       xcondition_wait(app_lock->cond, app_lock->mutex);
+    }
+#endif
+    if (!xthread_equal(app_lock->stack.st[app_lock->stack.sp].t, self)) {
+       int ii;
+       for (ii = app_lock->stack.sp - 1; ii >= 0; ii--) {
+           if (xthread_equal(app_lock->stack.st[ii].t, self)) {
+               xcondition_wait(app_lock->stack.st[ii].c, app_lock->mutex);
+               break;
+           }
+       }
+#ifndef _XMUTEX_NESTS
+       while(xthread_have_id(app_lock->holder)) {
+           xcondition_wait(app_lock->cond, app_lock->mutex);
+       }
+#endif
+    }
+#ifdef _XMUTEX_NESTS
+    while (app_lock->level < level) {
+       xmutex_lock(app_lock->mutex);
+       app_lock->level++;
+    }
+#else
+    app_lock->holder = self;
+    app_lock->level = level;
+    assert(xthread_equal(app_lock->holder, self));
+#endif
+    if (*pushed_thread) {
+       *pushed_thread = FALSE;
+       (app_lock->stack.sp)--;
+       if (app_lock->stack.sp >= 0) {
+           xcondition_signal (app_lock->stack.st[app_lock->stack.sp].c);
+       }
+    }
+#ifndef _XMUTEX_NESTS
+    xmutex_unlock(app_lock->mutex);
+#endif
+}
+
+static void
+FreeAppLock(XtAppContext app)
+{
+    unsigned ii;
+    LockPtr app_lock = app->lock_info;
+
+    if(app_lock) {
+       xmutex_clear(app_lock->mutex);
+       xmutex_free(app_lock->mutex);
+#ifndef _XMUTEX_NESTS
+       xcondition_clear(app_lock->cond);
+       xcondition_free(app_lock->cond);
+#endif
+       if(app_lock->stack.st != (struct _Tstack *)NULL) {
+           for (ii = 0; ii < app_lock->stack.size; ii++) {
+               xcondition_clear(app_lock->stack.st[ii].c);
+               xcondition_free(app_lock->stack.st[ii].c);
+           }
+           XtFree((char *)app_lock->stack.st);
+       }
+       XtFree((char *)app_lock);
+       app->lock_info = NULL;
+    }
+}
+
+static void
+InitAppLock(XtAppContext app)
+{
+    int ii;
+    LockPtr app_lock;
+
+    app->lock = AppLock;
+    app->unlock = AppUnlock;
+    app->yield_lock = YieldAppLock;
+    app->restore_lock = RestoreAppLock;
+    app->free_lock = FreeAppLock;
+
+    app_lock = app->lock_info = XtNew(LockRec);
+    app_lock->mutex = xmutex_malloc();
+    xmutex_init(app_lock->mutex);
+    app_lock->level = 0;
+#ifndef _XMUTEX_NESTS
+    app_lock->cond = xcondition_malloc();
+    xcondition_init(app_lock->cond);
+    xthread_clear_id(app_lock->holder);
+#endif
+    app_lock->stack.size = STACK_INCR;
+    app_lock->stack.sp = -1;
+    app_lock->stack.st =
+       (struct _Tstack *)__XtMalloc(sizeof(struct _Tstack)*STACK_INCR);
+    for (ii = 0; ii < STACK_INCR; ii++) {
+       app_lock->stack.st[ii].c = xcondition_malloc();
+       xcondition_init(app_lock->stack.st[ii].c);
+    }
+}
+
+#endif /* defined(XTHREADS) */
+
+void XtAppLock(XtAppContext app)
+{
+#ifdef XTHREADS
+    if(app->lock)
+       (*app->lock)(app);
+#endif
+}
+
+void XtAppUnlock(XtAppContext app)
+{
+#ifdef XTHREADS
+    if(app->unlock)
+       (*app->unlock)(app);
+#endif
+}
+
+void XtProcessLock(void)
+{
+#ifdef XTHREADS
+    if(_XtProcessLock)
+       (*_XtProcessLock)();
+#endif
+}
+
+void XtProcessUnlock(void)
+{
+#ifdef XTHREADS
+    if(_XtProcessUnlock)
+       (*_XtProcessUnlock)();
+#endif
+}
+
+Boolean XtToolkitThreadInitialize(void)
+{
+#ifdef XTHREADS
+    if (_XtProcessLock == NULL) {
+#ifdef xthread_init
+       xthread_init();
+#endif
+       InitProcessLock();
+       _XtProcessLock = ProcessLock;
+       _XtProcessUnlock = ProcessUnlock;
+       _XtInitAppLock = InitAppLock;
+    }
+    return True;
+#else
+    return False;
+#endif
+}
+
diff --git a/src/VarCreate.c b/src/VarCreate.c
new file mode 100644 (file)
index 0000000..0fba379
--- /dev/null
@@ -0,0 +1,394 @@
+/*
+
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+*/
+
+/*
+
+Copyright 1885, 1986, 1987, 1988, 1989, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+#include "Shell.h"
+#include "VarargsI.h"
+#include "CreateI.h"
+
+#if (defined(SUNSHLIB) || defined(AIXSHLIB)) && defined(SHAREDCODE)
+#define XtToolkitInitialize _XtToolkitInitialize
+#endif /* (SUNSHLIB || AIXSHLIB) && SHAREDCODE */
+
+static Widget
+_XtVaCreateWidget(
+    String      name,
+    WidgetClass widget_class,
+    Widget      parent,
+    va_list     var,
+    int                count)
+{
+    register Widget         widget;
+    XtTypedArgList         typed_args = NULL;
+    Cardinal               num_args;
+
+    _XtVaToTypedArgList(var, count, &typed_args, &num_args);
+
+    widget = _XtCreateWidget(name, widget_class, parent, (ArgList)NULL,
+                   (Cardinal)0, typed_args, num_args);
+
+    if (typed_args != NULL) {
+        XtFree((XtPointer)typed_args);
+    }
+
+    return widget;
+}
+
+
+Widget
+XtVaCreateWidget(
+    _Xconst char* name,
+    WidgetClass widget_class,
+    Widget parent,
+    ...)
+{
+    va_list                 var;
+    register Widget         widget;
+    int                            total_count, typed_count;
+    WIDGET_TO_APPCON(parent);
+
+    LOCK_APP(app);
+    va_start(var,parent);
+    _XtCountVaList(var, &total_count, &typed_count);
+    va_end(var);
+
+    va_start(var,parent);
+    widget = _XtVaCreateWidget((String)name, widget_class, parent, var,
+                               total_count);
+    va_end(var);
+    UNLOCK_APP(app);
+    return widget;
+}
+
+
+Widget
+XtVaCreateManagedWidget(
+    _Xconst char* name,
+    WidgetClass widget_class,
+    Widget parent,
+    ...)
+{
+    va_list            var;
+    register Widget    widget;
+    int                        total_count, typed_count;
+    WIDGET_TO_APPCON(parent);
+
+    LOCK_APP(app);
+    va_start(var,parent);
+    _XtCountVaList(var, &total_count, &typed_count);
+    va_end(var);
+
+    va_start(var,parent);
+    widget = _XtVaCreateWidget((String)name, widget_class, parent, var,
+                               total_count);
+    XtManageChild(widget);
+    va_end(var);
+    UNLOCK_APP(app);
+    return widget;
+}
+
+
+Widget
+XtVaAppCreateShell(
+    _Xconst char* name,
+    _Xconst char* class,
+    WidgetClass widget_class,
+    Display* display,
+    ...)
+{
+    va_list                 var;
+    register Widget         widget;
+    XtTypedArgList          typed_args = NULL;
+    Cardinal                num_args;
+    int                            total_count, typed_count;
+    DPY_TO_APPCON(display);
+
+    LOCK_APP(app);
+    va_start(var,display);
+    _XtCountVaList(var, &total_count, &typed_count);
+    va_end(var);
+
+    va_start(var,display);
+
+    _XtVaToTypedArgList(var, total_count, &typed_args, &num_args);
+    widget = _XtAppCreateShell((String)name, (String)class, widget_class,
+               display, (ArgList)NULL, (Cardinal)0, typed_args, num_args);
+    if (typed_args != NULL) {
+       XtFree((XtPointer)typed_args);
+    }
+
+    va_end(var);
+    UNLOCK_APP(app);
+    return widget;
+}
+
+
+Widget
+XtVaCreatePopupShell(
+    _Xconst char* name,
+    WidgetClass widget_class,
+    Widget parent,
+    ...)
+{
+    va_list                 var;
+    register Widget         widget;
+    XtTypedArgList          typed_args = NULL;
+    Cardinal                num_args;
+    int                            total_count, typed_count;
+    WIDGET_TO_APPCON(parent);
+
+    LOCK_APP(app);
+    va_start(var,parent);
+    _XtCountVaList(var, &total_count, &typed_count);
+    va_end(var);
+
+    va_start(var,parent);
+
+    _XtVaToTypedArgList(var, total_count, &typed_args, &num_args);
+    widget = _XtCreatePopupShell((String)name, widget_class, parent,
+               (ArgList)NULL, (Cardinal)0, typed_args, num_args);
+    if (typed_args != NULL) {
+       XtFree((XtPointer)typed_args);
+    }
+
+    va_end(var);
+    UNLOCK_APP(app);
+    return widget;
+}
+
+void
+XtVaSetValues(Widget widget, ...)
+{
+    va_list                 var;
+    ArgList                 args = NULL;
+    Cardinal                num_args;
+    int                            total_count, typed_count;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    va_start(var,widget);
+    _XtCountVaList(var, &total_count, &typed_count);
+    va_end(var);
+
+    va_start(var,widget);
+
+    _XtVaToArgList(widget, var, total_count, &args, &num_args);
+    XtSetValues(widget, args, num_args);
+    _XtFreeArgList(args, total_count, typed_count);
+
+    UNLOCK_APP(app);
+    va_end(var);
+}
+
+
+void
+XtVaSetSubvalues(XtPointer base, XtResourceList resources, Cardinal num_resources, ...)
+{
+    va_list    var;
+    ArgList            args;
+    Cardinal           num_args;
+    int                total_count, typed_count;
+
+    va_start(var, num_resources);
+    _XtCountVaList(var, &total_count, &typed_count);
+    va_end(var);
+
+    if (typed_count != 0) {
+       XtWarning("XtVaTypedArg is not valid in XtVaSetSubvalues()\n");
+    }
+
+    va_start(var, num_resources);
+    _XtVaToArgList((Widget)NULL, var, total_count, &args, &num_args);
+
+    XtSetSubvalues(base, resources, num_resources, args, num_args);
+
+    if (num_args != 0) {
+        XtFree((XtPointer)args);
+    }
+
+    va_end(var);
+}
+
+Widget
+_XtVaOpenApplication(
+    XtAppContext *app_context_return,
+    _Xconst char* application_class,
+    XrmOptionDescList options,
+    Cardinal num_options,
+    int *argc_in_out,
+    String *argv_in_out,
+    String *fallback_resources,
+    WidgetClass widget_class,
+    va_list var_args)
+{
+    XtAppContext app_con;
+    Display * dpy;
+    register int saved_argc = *argc_in_out;
+    Widget root;
+    String attr;
+    int count = 0;
+    XtTypedArgList typed_args;
+
+    XtToolkitInitialize(); /* cannot be moved into _XtAppInit */
+
+    dpy = _XtAppInit(&app_con, (String)application_class, options, num_options,
+                    argc_in_out, &argv_in_out, fallback_resources);
+
+    typed_args = (XtTypedArgList) __XtMalloc((unsigned) sizeof(XtTypedArg));
+    attr = va_arg (var_args, String);
+    for(; attr != NULL; attr = va_arg (var_args, String)) {
+        if (strcmp(attr, XtVaTypedArg) == 0) {
+            typed_args[count].name = va_arg(var_args, String);
+            typed_args[count].type = va_arg(var_args, String);
+            typed_args[count].value = va_arg(var_args, XtArgVal);
+            typed_args[count].size = va_arg(var_args, int);
+        } else {
+           typed_args[count].name = attr;
+           typed_args[count].type = NULL;
+           typed_args[count].value = va_arg(var_args, XtArgVal);
+           typed_args[count].size = 0;
+        }
+       count++;
+       typed_args = (XtTypedArgList)
+           XtRealloc((char *) typed_args,
+                      (unsigned) (count + 1) * sizeof(XtTypedArg));
+    }
+    typed_args[count].name = NULL;
+
+    va_end (var_args);
+
+    root =
+       XtVaAppCreateShell( NULL, application_class,
+                           widget_class, dpy,
+                           XtNscreen, (XtArgVal)DefaultScreenOfDisplay(dpy),
+                           XtNargc, (XtArgVal)saved_argc,
+                           XtNargv, (XtArgVal)argv_in_out,
+                           XtVaNestedList, (XtVarArgsList)typed_args,
+                           NULL );
+
+    if (app_context_return != NULL)
+       *app_context_return = app_con;
+
+    XtFree((XtPointer)typed_args);
+    XtFree((XtPointer)argv_in_out);
+    return(root);
+}
+
+Widget
+_XtVaAppInitialize(
+    XtAppContext *app_context_return,
+    _Xconst char* application_class,
+    XrmOptionDescList options,
+    Cardinal num_options,
+    int *argc_in_out,
+    String *argv_in_out,
+    String *fallback_resources,
+    va_list var_args)
+{
+    return _XtVaOpenApplication(app_context_return, application_class,
+                               options, num_options,
+                               argc_in_out, argv_in_out, fallback_resources,
+                               applicationShellWidgetClass, var_args);
+}
+
+#if !((defined(SUNSHLIB) || defined(AIXSHLIB)) && defined(SHAREDCODE))
+
+/*
+ * If not used as a shared library, we still need a front end to
+ * _XtVaOpenApplication and to _XtVaAppInitialize.
+ */
+
+Widget
+XtVaOpenApplication(
+    XtAppContext *app_context_return,
+    _Xconst char* application_class,
+    XrmOptionDescList options,
+    Cardinal num_options,
+    int *argc_in_out,
+    String *argv_in_out,
+    String *fallback_resources,
+    WidgetClass widget_class,
+    ...)
+{
+    va_list    var;
+
+    va_start(var, widget_class);
+    return _XtVaOpenApplication(app_context_return, (String)application_class,
+                               options, num_options, argc_in_out, argv_in_out,
+                               fallback_resources, widget_class, var);
+}
+
+Widget
+XtVaAppInitialize(
+    XtAppContext *app_context_return,
+    _Xconst char* application_class,
+    XrmOptionDescList options,
+    Cardinal num_options,
+    int *argc_in_out,
+    String *argv_in_out,
+    String *fallback_resources,
+    ...)
+{
+    va_list    var;
+
+    va_start(var, fallback_resources);
+    return _XtVaOpenApplication(app_context_return, (String)application_class,
+                               options, num_options, argc_in_out, argv_in_out,
+                               fallback_resources,
+                               applicationShellWidgetClass, var);
+}
+
+#endif /* !((SUNSHLIB || AIXSHLIB) && SHAREDCODE) */
+
diff --git a/src/VarGet.c b/src/VarGet.c
new file mode 100644 (file)
index 0000000..7b4cea6
--- /dev/null
@@ -0,0 +1,313 @@
+/*
+
+Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
+
+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 (including the next
+paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+
+*/
+
+/*
+
+Copyright 1985, 1986, 1987, 1988, 1989, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "VarargsI.h"
+#include "StringDefs.h"
+
+static String XtNxtGetTypedArg = "xtGetTypedArg";
+
+void
+XtVaGetSubresources(
+    Widget widget,
+    XtPointer base,
+    _Xconst char* name,
+    _Xconst char* class,
+    XtResourceList resources,
+    Cardinal num_resources,
+    ...)
+{
+    va_list                 var;
+    XtTypedArgList          args;
+    Cardinal                num_args;
+    int                            total_count, typed_count;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    va_start(var, num_resources);
+    _XtCountVaList(var, &total_count, &typed_count);
+    va_end(var);
+
+    va_start(var, num_resources);
+
+    _XtVaToTypedArgList(var, total_count, &args, &num_args);
+
+    _XtGetSubresources(widget, base, name, class, resources, num_resources,
+       NULL, 0, args, num_args);
+
+    if (num_args != 0) {
+       XtFree((XtPointer)args);
+    }
+
+    va_end(var);
+    UNLOCK_APP(app);
+}
+
+
+void
+XtVaGetApplicationResources(Widget widget, XtPointer base, XtResourceList resources, Cardinal num_resources, ...)
+{
+    va_list                 var;
+    XtTypedArgList          args;
+    Cardinal                num_args;
+    int                            total_count, typed_count;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    va_start(var,num_resources);
+    _XtCountVaList(var, &total_count, &typed_count);
+    va_end(var);
+
+    va_start(var,num_resources);
+
+    _XtVaToTypedArgList(var, total_count, &args, &num_args);
+
+    _XtGetApplicationResources(widget, base, resources, num_resources,
+       NULL, 0, args, num_args);
+
+    if (num_args != 0) {
+       XtFree((XtPointer)args);
+    }
+
+    va_end(var);
+    UNLOCK_APP(app);
+}
+
+
+static void
+GetTypedArg(
+    Widget              widget,
+    XtTypedArgList     typed_arg,
+    XtResourceList      resources,
+    Cardinal            num_resources)
+{
+    String              from_type = NULL;
+    Cardinal           from_size = 0;
+    XrmValue            from_val, to_val;
+    register Cardinal   i;
+    Arg                        arg;
+    XtPointer          value;
+
+    /* note we presume that the XtResourceList to be un-compiled */
+
+    for (i = 0; i < num_resources; i++) {
+        if (StringToName(typed_arg->name) == StringToName(resources[i].resource_name)) {
+            from_type = resources[i].resource_type;
+           from_size = resources[i].resource_size;
+            break;
+        }
+    }
+
+    if (i == num_resources) {
+       XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+            "unknownType", XtNxtGetTypedArg, XtCXtToolkitError,
+            "Unable to find type of resource for conversion",
+            (String *)NULL, (Cardinal *)NULL);
+       return;
+    }
+
+    value = ALLOCATE_LOCAL(from_size);
+    if (value == NULL) _XtAllocError(NULL);
+    XtSetArg(arg, typed_arg->name, value);
+    XtGetValues(widget, &arg, 1);
+
+    from_val.size = from_size;
+    from_val.addr = (XPointer)value;
+    to_val.addr = (XPointer)typed_arg->value;
+    to_val.size = typed_arg->size;
+
+    if (!XtConvertAndStore(widget, from_type, &from_val,
+                          typed_arg->type, &to_val)) {
+       if (to_val.size > (unsigned) typed_arg->size) {
+           String params[2];
+           Cardinal num_params = 2;
+           params[0] = typed_arg->type;
+           params[1] = XtName(widget);
+           XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+               "insufficientSpace", XtNxtGetTypedArg, XtCXtToolkitError,
+               "Insufficient space for converted type '%s' in widget '%s'",
+               params, &num_params);
+       }
+       else {
+           String params[3];
+           Cardinal num_params = 3;
+           params[0] = from_type;
+           params[1] = typed_arg->type;
+           params[2] = XtName(widget);
+           XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+               "conversionFailed", XtNxtGetTypedArg, XtCXtToolkitError,
+               "Type conversion (%s to %s) failed for widget '%s'",
+               params, &num_params);
+       }
+    }
+    DEALLOCATE_LOCAL(value);
+}
+
+static int
+GetNestedArg(
+    Widget              widget,
+    XtTypedArgList     avlist,
+    ArgList             args,
+    XtResourceList      resources,
+    Cardinal            num_resources)
+{
+    int         count = 0;
+
+    for (; avlist->name != NULL; avlist++) {
+        if (avlist->type != NULL) {
+           GetTypedArg(widget, avlist, resources, num_resources);
+        } else if(strcmp(avlist->name, XtVaNestedList) == 0) {
+            count += GetNestedArg(widget, (XtTypedArgList)avlist->value,
+                                    args, resources, num_resources);
+        } else {
+            (args+count)->name = avlist->name;
+            (args+count)->value = avlist->value;
+            ++count;
+        }
+    }
+
+    return(count);
+}
+
+void
+XtVaGetValues(Widget widget, ...)
+{
+    va_list            var;
+    String             attr;
+    ArgList                    args;
+    XtTypedArg         typed_arg;
+    XtResourceList      resources = (XtResourceList)NULL;
+    Cardinal            num_resources;
+    int                        count, total_count, typed_count;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    va_start(var,widget);
+
+    _XtCountVaList(var, &total_count, &typed_count);
+
+    if (total_count != typed_count) {
+        args = (ArgList)__XtMalloc((unsigned)((total_count - typed_count)
+                               * sizeof(Arg)));
+    }
+    else args = NULL;          /* for lint; really unused */
+    va_end(var);
+
+    va_start(var,widget);
+    for(attr = va_arg(var, String), count = 0 ; attr != NULL;
+                       attr = va_arg(var, String)) {
+       if (strcmp(attr, XtVaTypedArg) == 0) {
+           typed_arg.name = va_arg(var, String);
+           typed_arg.type = va_arg(var, String);
+           typed_arg.value = va_arg(var, XtArgVal);
+           typed_arg.size = va_arg(var, int);
+
+           if (resources == NULL) {
+               XtGetResourceList(XtClass(widget), &resources,&num_resources);
+           }
+
+           GetTypedArg(widget, &typed_arg, resources, num_resources);
+       } else if (strcmp(attr, XtVaNestedList) == 0) {
+           if (resources == NULL) {
+               XtGetResourceList(XtClass(widget),&resources, &num_resources);
+           }
+
+           count += GetNestedArg(widget, va_arg(var, XtTypedArgList),
+                                    (args+count), resources, num_resources);
+       } else {
+           args[count].name = attr;
+           args[count].value = va_arg(var, XtArgVal);
+           count ++;
+       }
+    }
+    va_end(var);
+
+    if (resources != (XtResourceList)NULL) {
+       XtFree((XtPointer)resources);
+    }
+
+    if (total_count != typed_count) {
+       XtGetValues(widget, args, count);
+       XtFree((XtPointer)args);
+    }
+    UNLOCK_APP(app);
+}
+
+void
+XtVaGetSubvalues(XtPointer base,XtResourceList  resources, Cardinal num_resources, ...)
+{
+    va_list    var;
+    ArgList            args;
+    Cardinal           num_args;
+    int                total_count, typed_count;
+
+    va_start(var,num_resources);
+
+    _XtCountVaList(var, &total_count, &typed_count);
+
+    if (typed_count != 0) {
+       XtWarning("XtVaTypedArg is an invalid argument to XtVaGetSubvalues()\n");
+    }
+    va_end(var);
+
+    va_start(var,num_resources);
+    _XtVaToArgList((Widget)NULL, var, total_count, &args, &num_args);
+    va_end(var);
+
+    XtGetSubvalues(base, resources, num_resources, args, num_args);
+
+    if (num_args != 0) {
+        XtFree((XtPointer)args);
+    }
+}
diff --git a/src/Varargs.c b/src/Varargs.c
new file mode 100644 (file)
index 0000000..b33e287
--- /dev/null
@@ -0,0 +1,517 @@
+/*
+
+Copyright 1985, 1986, 1987, 1988, 1989, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "VarargsI.h"
+#include "StringDefs.h"
+
+static String XtNxtConvertVarToArgList = "xtConvertVarToArgList";
+
+/*
+ *    Given a nested list, _XtCountNestedList() returns counts of the
+ *    total number of attribute-value pairs and the count of those
+ *    attributes that are typed. The list is counted recursively.
+ */
+static  void
+_XtCountNestedList(
+    XtTypedArgList  avlist,
+    int             *total_count,
+    int             *typed_count)
+{
+    for (; avlist->name != NULL; avlist++) {
+        if (strcmp(avlist->name, XtVaNestedList) == 0) {
+            _XtCountNestedList((XtTypedArgList)avlist->value, total_count,
+                              typed_count);
+        } else {
+            if (avlist->type != NULL) {
+                ++(*typed_count);
+            }
+            ++(*total_count);
+        }
+    }
+}
+
+
+/*
+ *    Given a variable length attribute-value list, _XtCountVaList()
+ *    returns counts of the total number of attribute-value pairs,
+ *    and the count of the number of those attributes that are typed.
+ *    The list is counted recursively.
+ */
+void
+_XtCountVaList(va_list var, int* total_count, int* typed_count)
+{
+    String          attr;
+
+    *total_count = 0;
+    *typed_count = 0;
+
+    for(attr = va_arg(var, String) ; attr != NULL;
+                        attr = va_arg(var, String)) {
+        if (strcmp(attr, XtVaTypedArg) == 0) {
+            (void)va_arg(var, String);
+            (void)va_arg(var, String);
+            (void)va_arg(var, XtArgVal);
+            (void)va_arg(var, int);
+            ++(*total_count);
+            ++(*typed_count);
+        } else if (strcmp(attr, XtVaNestedList) == 0) {
+            _XtCountNestedList(va_arg(var, XtTypedArgList), total_count,
+                typed_count);
+        } else {
+            (void)va_arg(var, XtArgVal);
+            ++(*total_count);
+       }
+    }
+}
+
+
+/*
+ *   Given a variable length attribute-value list, XtVaCreateArgsList()
+ *   constructs an attribute-value list of type XtTypedArgList and
+ *   returns the list.
+ */
+XtVarArgsList
+XtVaCreateArgsList(XtPointer unused, ...)
+{
+    va_list var;
+    XtTypedArgList  avlist;
+    int                    count = 0;
+    String         attr;
+
+    /*
+     * Count the number of attribute-value pairs in the list.
+     * Note: The count is required only to allocate enough space to store
+     * the list. Therefore nested lists are not counted recursively.
+     */
+    va_start(var,unused);
+    for(attr = va_arg(var, String) ; attr != NULL;
+                        attr = va_arg(var, String)) {
+        ++count;
+        if (strcmp(attr, XtVaTypedArg) == 0) {
+            (void)va_arg(var, String);
+            (void)va_arg(var, String);
+            (void)va_arg(var, XtArgVal);
+            (void)va_arg(var, int);
+        } else {
+            (void)va_arg(var, XtArgVal);
+        }
+    }
+    va_end(var);
+
+    va_start(var,unused);
+    avlist = _XtVaCreateTypedArgList(var, count);
+    va_end(var);
+    return (XtVarArgsList)avlist;
+}
+
+
+XtTypedArgList _XtVaCreateTypedArgList(va_list var, register int count)
+{
+    String         attr;
+    XtTypedArgList  avlist;
+
+    avlist = (XtTypedArgList)
+               __XtCalloc((int)count + 1, (unsigned)sizeof(XtTypedArg));
+
+    for(attr = va_arg(var, String), count = 0; attr != NULL;
+               attr = va_arg(var, String)) {
+       if (strcmp(attr, XtVaTypedArg) == 0) {
+           avlist[count].name = va_arg(var, String);
+           avlist[count].type = va_arg(var, String);
+           avlist[count].value = va_arg(var, XtArgVal);
+           avlist[count].size = va_arg(var, int);
+       } else {
+           avlist[count].name = attr;
+           avlist[count].type = NULL;
+           avlist[count].value = va_arg(var, XtArgVal);
+       }
+       ++count;
+    }
+    avlist[count].name = NULL;
+
+    return avlist;
+}
+
+
+/*
+ *    TypedArgToArg() invokes a resource converter to convert the
+ *    passed typed arg into a name/value pair and stores the name/value
+ *    pair in the passed Arg structure.  If memory is allocated for the
+ *    converted value, the address is returned in the value field of
+ *    memory_return; otherwise that field is NULL.  The function returns
+ *    1 if the conversion succeeded and 0 if the conversion failed.
+ */
+static int
+TypedArgToArg(
+    Widget              widget,
+    XtTypedArgList      typed_arg,
+    ArgList             arg_return,
+    XtResourceList      resources,
+    Cardinal            num_resources,
+    ArgList            memory_return)
+{
+    String              to_type = NULL;
+    XrmValue            from_val, to_val;
+
+
+    if (widget == NULL) {
+        XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+            "nullWidget", XtNxtConvertVarToArgList, XtCXtToolkitError,
+           "XtVaTypedArg conversion needs non-NULL widget handle",
+            (String *)NULL, (Cardinal *)NULL);
+        return(0);
+    }
+
+    /* again we assume that the XtResourceList is un-compiled */
+
+    for (; num_resources--; resources++)
+       if (strcmp(typed_arg->name, resources->resource_name) == 0) {
+           to_type = resources->resource_type;
+           break;
+       }
+
+    if (to_type == NULL) {
+        XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+            "unknownType", XtNxtConvertVarToArgList, XtCXtToolkitError,
+            "Unable to find type of resource for conversion",
+            (String *)NULL, (Cardinal *)NULL);
+        return(0);
+    }
+
+    to_val.addr = NULL;
+    from_val.size = typed_arg->size;
+    if ((strcmp(typed_arg->type, XtRString) == 0) ||
+            ((unsigned) typed_arg->size > sizeof(XtArgVal))) {
+        from_val.addr = (XPointer)typed_arg->value;
+    } else {
+            from_val.addr = (XPointer)&typed_arg->value;
+    }
+
+    LOCK_PROCESS;
+    XtConvertAndStore(widget, typed_arg->type, &from_val, to_type, &to_val);
+
+    if (to_val.addr == NULL) {
+       UNLOCK_PROCESS;
+        XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+            "conversionFailed", XtNxtConvertVarToArgList, XtCXtToolkitError,
+            "Type conversion failed", (String *)NULL, (Cardinal *)NULL);
+        return(0);
+    }
+
+    arg_return->name = typed_arg->name;
+    memory_return->value = (XtArgVal) NULL;
+
+    if (strcmp(to_type, XtRString) == 0) {
+       arg_return->value = (XtArgVal) to_val.addr;
+    }
+    else {
+       if (to_val.size == sizeof(long))
+           arg_return->value = (XtArgVal) *(long *)to_val.addr;
+       else if (to_val.size == sizeof(int))
+           arg_return->value = (XtArgVal) *(int *)to_val.addr;
+       else if (to_val.size == sizeof(short))
+           arg_return->value = (XtArgVal) *(short *)to_val.addr;
+       else if (to_val.size == sizeof(char))
+           arg_return->value = (XtArgVal) *(char *)to_val.addr;
+       else if (to_val.size == sizeof(XtArgVal))
+           arg_return->value = *(XtArgVal *)to_val.addr;
+       else if (to_val.size > sizeof(XtArgVal)) {
+           arg_return->value = (XtArgVal) __XtMalloc(to_val.size);
+           memory_return->value = (XtArgVal)
+               memcpy((void *)arg_return->value, to_val.addr, to_val.size);
+       }
+    }
+    UNLOCK_PROCESS;
+
+    return(1);
+}
+
+
+/*
+ *    NestedArgtoArg() converts the passed nested list into
+ *    an ArgList/count.
+ */
+static int
+NestedArgtoArg(
+    Widget              widget,
+    XtTypedArgList      avlist,
+    ArgList             args,
+    XtResourceList      resources,
+    Cardinal            num_resources,
+    ArgList            memory_return)
+{
+    int         count = 0;
+
+    for (; avlist->name != NULL; avlist++) {
+        if (avlist->type != NULL) {
+            /* If widget is NULL, the typed arg is ignored */
+            if (widget != NULL) {
+                /* this is a typed arg */
+                count += TypedArgToArg(widget, avlist, (args+count),
+                                         resources, num_resources,
+                                         (memory_return+count));
+            }
+        } else if (strcmp(avlist->name, XtVaNestedList) == 0) {
+            count += NestedArgtoArg(widget, (XtTypedArgList)avlist->value,
+                                      (args+count), resources, num_resources,
+                                      (memory_return+count));
+        } else {
+            (args+count)->name = avlist->name;
+            (args+count)->value = avlist->value;
+            ++count;
+        }
+    }
+
+    return(count);
+}
+
+/*
+ * Free memory allocated through _XtVaToArgList.  The actual args array
+ * size is expected to be total_count * 2, where total_count is the number
+ * of elements needed for resource representations.  The lower half of the
+ * array contains pairs of resource names and values as usual.  For each
+ * element [n] in the lower half of the array, the value field of the
+ * corresponding element [n + total_count] in the upper half of the array
+ * has been pressed into service in order to note whether the resource value
+ * is a pointer to memory that was allocated in TypedArgToArg.  In the
+ * upper half, if the value field is not NULL, it contains the address of
+ * memory which should now be freed.  That memory could have been allocated
+ * only as a result of the conversion of typed arguments.  Therefore, if
+ * there were no typed arguments in the original varargs, there is no need
+ * to examine the upper half of the array.  In the choice of data structure
+ * to make this representation, priority was given to the wish to retrofit
+ * the release of memory around the existing signature of _XtVaToArgList.
+ */
+void
+_XtFreeArgList(
+    ArgList    args,        /* as returned by _XtVaToArgList */
+    int                total_count, /*  argument count returned by _XtCountVaList */
+    int        typed_count) /* typed arg count returned by _XtCountVaList */
+{
+    ArgList p;
+
+    if (args) {
+       if (typed_count)
+           for (p = args + total_count; total_count--; ++p) {
+               XtFree((char *)p->value);
+           }
+       XtFree((char *)args);
+    }
+}
+
+
+static void GetResources(Widget widget, XtResourceList *res_list,
+                        Cardinal *number);
+
+
+/*
+ *    Given a variable argument list, _XtVaToArgList() returns the
+ *    equivalent ArgList and count. _XtVaToArgList() handles nested
+ *    lists and typed arguments.  If typed arguments are present, the
+ *    ArgList should be freed with _XtFreeArgList.
+ */
+void
+_XtVaToArgList(
+    Widget             widget,
+    va_list            var,
+    int                        max_count,
+    ArgList            *args_return,
+    Cardinal           *num_args_return)
+{
+    String             attr;
+    int                        count;
+    ArgList            args = (ArgList)NULL;
+    XtTypedArg         typed_arg;
+    XtResourceList     resources = (XtResourceList)NULL;
+    Cardinal           num_resources;
+    Boolean            fetched_resource_list = False;
+
+    if (max_count  == 0) {
+       *num_args_return = 0;
+       *args_return = (ArgList)NULL;
+       return;
+    }
+
+    args = (ArgList)__XtMalloc((unsigned)(max_count * 2 * sizeof(Arg)));
+    for (count = max_count * 2; --count >= 0; )
+       args[count].value = (XtArgVal) NULL;
+    count = 0;
+
+    for(attr = va_arg(var, String) ; attr != NULL;
+                       attr = va_arg(var, String)) {
+       if (strcmp(attr, XtVaTypedArg) == 0) {
+           typed_arg.name = va_arg(var, String);
+           typed_arg.type = va_arg(var, String);
+           typed_arg.value = va_arg(var, XtArgVal);
+           typed_arg.size = va_arg(var, int);
+
+           /* if widget is NULL, typed args are ignored */
+           if (widget != NULL) {
+               if (!fetched_resource_list) {
+                   GetResources(widget, &resources, &num_resources);
+                   fetched_resource_list = True;
+               }
+               count += TypedArgToArg(widget, &typed_arg, &args[count],
+                                         resources, num_resources,
+                                         &args[max_count + count]);
+           }
+       } else if (strcmp(attr, XtVaNestedList) == 0) {
+           if (widget != NULL) {
+               if (!fetched_resource_list) {
+                   GetResources(widget, &resources, &num_resources);
+                   fetched_resource_list = True;
+               }
+           }
+
+           count += NestedArgtoArg(widget, va_arg(var, XtTypedArgList),
+                                      &args[count], resources, num_resources,
+                                      &args[max_count + count]);
+       } else {
+           args[count].name = attr;
+           args[count].value = va_arg(var, XtArgVal);
+           count ++;
+       }
+    }
+
+    XtFree((XtPointer)resources);
+
+    *num_args_return = (Cardinal)count;
+    *args_return = (ArgList)args;
+}
+
+/*     Function Name: GetResources
+ *     Description: Retreives the normal and constraint resources
+ *                   for this widget.
+ *     Arguments: widget - the widget.
+ * RETURNED        res_list - the list of resource for this widget
+ * RETURNED        number - the number of resources in the above list.
+ *     Returns: none
+ */
+
+static void
+GetResources(
+    Widget widget,
+    XtResourceList * res_list,
+    Cardinal * number)
+{
+    Widget parent = XtParent(widget);
+
+    XtInitializeWidgetClass(XtClass(widget));
+    XtGetResourceList(XtClass(widget), res_list, number);
+
+    if (!XtIsShell(widget) && parent && XtIsConstraint(parent)) {
+       XtResourceList res, constraint, cons_top;
+       Cardinal num_constraint, temp;
+
+       XtGetConstraintResourceList(XtClass(parent), &constraint,
+                                   &num_constraint);
+
+       cons_top = constraint;
+       *res_list = (XtResourceList) XtRealloc((char*)*res_list,
+                                              ((*number + num_constraint) *
+                                               sizeof(XtResource)));
+
+       for (temp= num_constraint, res= *res_list + *number; temp != 0; temp--)
+           *res++ = *constraint++;
+
+       *number += num_constraint;
+       XtFree( (XtPointer) cons_top);
+    }
+}
+
+static int NestedArgtoTypedArg(
+    XtTypedArgList      args,
+    XtTypedArgList      avlist)
+{
+    int         count = 0;
+
+    for (; avlist->name != NULL; avlist++) {
+        if (avlist->type != NULL) {
+            (args+count)->name = avlist->name;
+            (args+count)->type = avlist->type;
+            (args+count)->size = avlist->size;
+            (args+count)->value = avlist->value;
+            ++count;
+        } else if(strcmp(avlist->name, XtVaNestedList) == 0) {
+            count += NestedArgtoTypedArg((args+count),
+                            (XtTypedArgList)avlist->value);
+        } else {
+            (args+count)->name = avlist->name;
+           (args+count)->type = NULL;
+            (args+count)->value = avlist->value;
+            ++count;
+        }
+    }
+    return(count);
+}
+
+
+/*
+ *    Given a variable argument list, _XtVaToTypedArgList() returns
+ *    the equivalent TypedArgList. _XtVaToTypedArgList() handles nested
+ *    lists.
+ *    Note: _XtVaToTypedArgList() does not do type conversions.
+ */
+void
+_XtVaToTypedArgList(
+    va_list             var,
+    int                        max_count,
+    XtTypedArgList     *args_return,
+    Cardinal            *num_args_return)
+{
+    XtTypedArgList     args = NULL;
+    String              attr;
+    int                        count;
+
+    args = (XtTypedArgList)
+       __XtMalloc((unsigned)(max_count * sizeof(XtTypedArg)));
+
+    for(attr = va_arg(var, String), count = 0 ; attr != NULL;
+                   attr = va_arg(var, String)) {
+        if (strcmp(attr, XtVaTypedArg) == 0) {
+           args[count].name = va_arg(var, String);
+           args[count].type = va_arg(var, String);
+           args[count].value = va_arg(var, XtArgVal);
+           args[count].size = va_arg(var, int);
+           ++count;
+       } else if (strcmp(attr, XtVaNestedList) == 0) {
+           count += NestedArgtoTypedArg(&args[count],
+                       va_arg(var, XtTypedArgList));
+       } else {
+           args[count].name = attr;
+           args[count].type = NULL;
+           args[count].value = va_arg(var, XtArgVal);
+           ++count;
+       }
+    }
+
+    *args_return = args;
+    *num_args_return = count;
+}
diff --git a/src/Vendor.c b/src/Vendor.c
new file mode 100644 (file)
index 0000000..26767b7
--- /dev/null
@@ -0,0 +1,156 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/* Make sure all wm properties can make it out of the resource manager */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+#include "Shell.h"
+#include "ShellP.h"
+#include "Vendor.h"
+#include "VendorP.h"
+#include <stdio.h>
+
+/***************************************************************************
+ *
+ * Vendor shell class record
+ *
+ ***************************************************************************/
+
+#if defined(__UNIXOS2__) || defined(__CYGWIN__) || defined(__MINGW32__)
+/* to fix the EditRes problem because of wrong linker semantics */
+extern WidgetClass vendorShellWidgetClass;
+
+#if defined(__UNIXOS2__)
+unsigned long _DLL_InitTerm(unsigned long mod,unsigned long flag)
+{
+        switch (flag) {
+        case 0: /*called on init*/
+                _CRT_init();
+                vendorShellWidgetClass = (WidgetClass)(&vendorShellClassRec);
+                return 1;
+        case 1: /*called on exit*/
+                return 1;
+        default:
+                return 0;
+        }
+}
+#endif
+
+#if defined(__CYGWIN__) || defined(__MINGW32__)
+int __stdcall
+DllMain(unsigned long mod_handle, unsigned long flag, void *routine)
+{
+  switch (flag)
+    {
+    case 1: /* DLL_PROCESS_ATTACH - process attach */
+      vendorShellWidgetClass = (WidgetClass)(&vendorShellClassRec);
+      break;
+    case 0: /* DLL_PROCESS_DETACH - process detach */
+      break;
+    }
+  return 1;
+}
+#endif
+#endif
+
+externaldef(vendorshellclassrec) VendorShellClassRec vendorShellClassRec = {
+  {
+    /* superclass         */    (WidgetClass) &wmShellClassRec,
+    /* class_name         */    "VendorShell",
+    /* size               */    sizeof(VendorShellRec),
+    /* Class Initializer  */   NULL,
+    /* class_part_initialize*/ NULL,
+    /* Class init'ed ?    */   FALSE,
+    /* initialize         */    NULL,
+    /* initialize_notify    */ NULL,
+    /* realize            */    XtInheritRealize,
+    /* actions            */    NULL,
+    /* num_actions        */    0,
+    /* resources          */    NULL,
+    /* resource_count     */   0,
+    /* xrm_class          */    NULLQUARK,
+    /* compress_motion    */    FALSE,
+    /* compress_exposure  */    TRUE,
+    /* compress_enterleave*/   FALSE,
+    /* visible_interest   */    FALSE,
+    /* destroy            */    NULL,
+    /* resize             */    XtInheritResize,
+    /* expose             */    NULL,
+    /* set_values         */    NULL,
+    /* set_values_hook      */ NULL,
+    /* set_values_almost    */ XtInheritSetValuesAlmost,
+    /* get_values_hook      */ NULL,
+    /* accept_focus       */    NULL,
+    /* intrinsics version */   XtVersion,
+    /* callback offsets   */    NULL,
+    /* tm_table                  */    NULL,
+    /* query_geometry      */  NULL,
+    /* display_accelerator  */  NULL,
+    /* extension           */  NULL
+  },{
+    /* geometry_manager   */    XtInheritGeometryManager,
+    /* change_managed     */    XtInheritChangeManaged,
+    /* insert_child      */    XtInheritInsertChild,
+    /* delete_child      */    XtInheritDeleteChild,
+    /* extension           */  NULL
+  },{
+    /* extension           */  NULL
+  },{
+    /* extension           */  NULL
+  },{
+    /* extension           */  NULL
+  }
+};
+
+#if !defined(AIXSHLIB) || !defined(SHAREDCODE)
+externaldef(vendorshellwidgetclass) WidgetClass vendorShellWidgetClass =
+       (WidgetClass) (&vendorShellClassRec);
+#endif
diff --git a/src/sharedlib.c b/src/sharedlib.c
new file mode 100644 (file)
index 0000000..7aefc23
--- /dev/null
@@ -0,0 +1,233 @@
+/*
+
+Copyright 1989, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+#if (defined(SUNSHLIB) || defined(AIXSHLIB)) && !defined(SHAREDCODE)
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "VarargsI.h"
+#include "ShellP.h"
+#include "VendorP.h"
+#include "CreateI.h"
+
+
+#if defined(AIXSHLIB) || defined(__UNIXOS2__)
+WidgetClass vendorShellWidgetClass = (WidgetClass) &vendorShellClassRec;
+
+static void _XtVendorInitialize()
+{
+    transientShellWidgetClass->core_class.superclass =
+       (WidgetClass) &vendorShellClassRec;
+    topLevelShellWidgetClass->core_class.superclass =
+       (WidgetClass) &vendorShellClassRec;
+}
+
+#define VENDORINIT _XtVendorInitialize();
+
+#else
+
+#define VENDORINIT /* as nothing */
+
+#endif
+
+#ifdef SUNSHLIB
+/*
+ * _XtInherit needs to be statically linked since it is compared against as
+ * well as called.
+ */
+void _XtInherit()
+{
+    extern void __XtInherit();
+    __XtInherit();
+}
+#endif
+
+/*
+ * The following routine will be called by every toolkit
+ * application, forcing this file to be statically linked.
+ *
+ * Note: XtInitialize, XtAppInitialize, and XtOpenApplication
+ *       call XtToolkitInitialize.
+ */
+
+void XtToolkitInitialize()
+{
+    extern void _XtToolkitInitialize();
+    VENDORINIT
+    _XtToolkitInitialize();
+}
+
+Widget
+XtInitialize(
+    _Xconst char* name,
+    _Xconst char* classname,
+    XrmOptionDescRec *options,
+    Cardinal num_options,
+    int *argc,
+    String *argv)
+{
+    extern Widget _XtInitialize();
+    VENDORINIT
+    return _XtInitialize (name, classname, options, num_options, argc, argv);
+}
+
+Widget
+XtAppInitialize(
+    XtAppContext * app_context_return,
+    _Xconst char* application_class,
+    XrmOptionDescRec *options,
+    Cardinal num_options,
+    int *argc_in_out,
+    String *argv_in_out,
+    String *fallback_resources,
+    ArgList args_in,
+    Cardinal num_args_in)
+{
+    extern Widget _XtAppInitialize();
+    VENDORINIT
+    return _XtAppInitialize (app_context_return, application_class, options,
+                            num_options, argc_in_out, argv_in_out,
+                            fallback_resources, args_in, num_args_in);
+}
+
+Widget
+XtVaAppInitialize(
+    XtAppContext *app_context_return,
+    _Xconst char* application_class,
+    XrmOptionDescList options,
+    Cardinal num_options,
+    int *argc_in_out,
+    String *argv_in_out,
+    String *fallback_resources,
+    ...)
+{
+    va_list    var;
+    extern Widget _XtVaAppInitialize();
+
+    VENDORINIT
+    va_start(var, fallback_resources);
+    return _XtVaAppInitialize(app_context_return, application_class, options,
+                             num_options, argc_in_out, argv_in_out,
+                             fallback_resources, var);
+}
+
+Widget
+XtOpenApplication(
+    XtAppContext * app_context_return,
+    _Xconst char* application_class,
+    XrmOptionDescRec *options,
+    Cardinal num_options,
+    int *argc_in_out,
+    String *argv_in_out,
+    String *fallback_resources,
+    WidgetClass widget_class,
+    ArgList args_in,
+    Cardinal num_args_in)
+{
+    extern Widget _XtOpenApplication();
+    VENDORINIT
+    return _XtOpenApplication (app_context_return, application_class, options,
+                              num_options, argc_in_out, argv_in_out,
+                              fallback_resources, widget_class,
+                              args_in, num_args_in);
+}
+
+Widget
+XtVaOpenApplication(
+    XtAppContext *app_context_return,
+    _Xconst char* application_class,
+    XrmOptionDescList options,
+    Cardinal num_options,
+    int *argc_in_out,
+    String *argv_in_out,
+    String *fallback_resources,
+    WidgetClass widget_class,
+    ...)
+{
+    va_list    var;
+    extern Widget _XtVaOpenApplication();
+
+    VENDORINIT
+    va_start(var, widget_class);
+    return _XtVaOpenApplication(app_context_return, application_class, options,
+                               num_options, argc_in_out, argv_in_out,
+                               fallback_resources, widget_class, var);
+}
+
+#else
+
+#ifndef lint
+static int dummy;                      /* avoid warning from ranlib */
+#endif
+
+#endif /* SUNSHLIB or AIXSHLIB */
+
+#if defined(SUNSHLIB) && !defined(SHAREDCODE)
+
+int _XtInheritTranslations = 0;
+
+extern CompositeClassRec compositeClassRec;
+WidgetClass compositeWidgetClass = (WidgetClass) &compositeClassRec;
+
+extern ConstraintClassRec constraintClassRec;
+WidgetClass constraintWidgetClass = (WidgetClass) &constraintClassRec;
+
+extern WidgetClassRec widgetClassRec;
+WidgetClass widgetClass = &widgetClassRec;
+WidgetClass coreWidgetClass = &widgetClassRec;
+
+extern ObjectClassRec objectClassRec;
+WidgetClass objectClass = (WidgetClass)&objectClassRec;
+
+extern RectObjClassRec rectObjClassRec;
+WidgetClass rectObjClass = (WidgetClass)&rectObjClassRec;
+
+extern ShellClassRec shellClassRec;
+WidgetClass shellWidgetClass = (WidgetClass) &shellClassRec;
+
+extern OverrideShellClassRec overrideShellClassRec;
+WidgetClass overrideShellWidgetClass = (WidgetClass) &overrideShellClassRec;
+
+extern WMShellClassRec wmShellClassRec;
+WidgetClass wmShellWidgetClass = (WidgetClass) &wmShellClassRec;
+
+extern TransientShellClassRec transientShellClassRec;
+WidgetClass transientShellWidgetClass = (WidgetClass) &transientShellClassRec;
+
+extern TopLevelShellClassRec topLevelShellClassRec;
+WidgetClass topLevelShellWidgetClass = (WidgetClass) &topLevelShellClassRec;
+
+extern ApplicationShellClassRec applicationShellClassRec;
+WidgetClass applicationShellWidgetClass = (WidgetClass) &applicationShellClassRec;
+
+extern SessionShellClassRec sessionShellClassRec;
+WidgetClass sessionShellWidgetClass = (WidgetClass) &sessionShellClassRec;
+
+extern HookObjClassRec hookObjClassRec;
+WidgetClass hookObjectClass = (WidgetClass) &hookObjClassRec;
+
+#endif /* SUNSHLIB */
diff --git a/test/Alloc.c b/test/Alloc.c
new file mode 100644 (file)
index 0000000..7f02e19
--- /dev/null
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * 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 (including the next
+ * paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+ */
+
+#include <X11/Intrinsic.h>
+#include <glib.h>
+#include <stdio.h>
+#include <string.h>
+
+static const char *program_name;
+
+/* Just a long string of characters to pull from */
+const char test_chars[] =
+    "|000 nul|001 soh|002 stx|003 etx|004 eot|005 enq|006 ack|007 bel|"
+    "|010 bs |011 ht |012 nl |013 vt |014 np |015 cr |016 so |017 si |"
+    "|020 dle|021 dc1|022 dc2|023 dc3|024 dc4|025 nak|026 syn|027 etb|"
+    "|030 can|031 em |032 sub|033 esc|034 fs |035 gs |036 rs |037 us |"
+    "|040 sp |041  ! |042  \" |043  # |044  $ |045  % |046  & |047  ' |"
+    "|050  ( |051  ) |052  * |053  + |054  , |055  - |056  . |057  / |"
+    "|060  0 |061  1 |062  2 |063  3 |064  4 |065  5 |066  6 |067  7 |"
+    "|070  8 |071  9 |072  : |073  ; |074  < |075  = |076  > |077  ? |"
+    "|100  @ |101  A |102  B |103  C |104  D |105  E |106  F |107  G |"
+    "|110  H |111  I |112  J |113  K |114  L |115  M |116  N |117  O |"
+    "|120  P |121  Q |122  R |123  S |124  T |125  U |126  V |127  W |"
+    "|130  X |131  Y |132  Z |133  [ |134  \\ |135  ] |136  ^ |137  _ |"
+    "|140  ` |141  a |142  b |143  c |144  d |145  e |146  f |147  g |"
+    "|150  h |151  i |152  j |153  k |154  l |155  m |156  n |157  o |"
+    "|160  p |161  q |162  r |163  s |164  t |165  u |166  v |167  w |"
+    "|170  x |171  y |172  z |173  { |174  | |175  } |176  ~ |177 del|"
+    "| 00 nul| 01 soh| 02 stx| 03 etx| 04 eot| 05 enq| 06 ack| 07 bel|"
+    "| 08 bs | 09 ht | 0a nl | 0b vt | 0c np | 0d cr | 0e so | 0f si |"
+    "| 10 dle| 11 dc1| 12 dc2| 13 dc3| 14 dc4| 15 nak| 16 syn| 17 etb|"
+    "| 18 can| 19 em | 1a sub| 1b esc| 1c fs | 1d gs | 1e rs | 1f us |"
+    "| 20 sp | 21  ! | 22  \" | 23  # | 24  $ | 25  % | 26  & | 27  ' |"
+    "| 28  ( | 29  ) | 2a  * | 2b  + | 2c  , | 2d  - | 2e  . | 2f  / |"
+    "| 30  0 | 31  1 | 32  2 | 33  3 | 34  4 | 35  5 | 36  6 | 37  7 |"
+    "| 38  8 | 39  9 | 3a  : | 3b  ; | 3c  < | 3d  = | 3e  > | 3f  ? |"
+    "| 40  @ | 41  A | 42  B | 43  C | 44  D | 45  E | 46  F | 47  G |"
+    "| 48  H | 49  I | 4a  J | 4b  K | 4c  L | 4d  M | 4e  N | 4f  O |"
+    "| 50  P | 51  Q | 52  R | 53  S | 54  T | 55  U | 56  V | 57  W |"
+    "| 58  X | 59  Y | 5a  Z | 5b  [ | 5c  \\ | 5d  ] | 5e  ^ | 5f  _ |"
+    "| 60  ` | 61  a | 62  b | 63  c | 64  d | 65  e | 66  f | 67  g |"
+    "| 68  h | 69  i | 6a  j | 6b  k | 6c  l | 6d  m | 6e  n | 6f  o |"
+    "| 70  p | 71  q | 72  r | 73  s | 74  t | 75  u | 76  v | 77  w |"
+    "| 78  x | 79  y | 7a  z | 7b  { | 7c  | | 7d  } | 7e  ~ | 7f del|";
+
+
+/* Test a simple short string & int */
+static void test_XtAsprintf_short(void)
+{
+    char snbuf[1024];
+    char *asbuf;
+    gint32 r = g_test_rand_int();
+    int snlen, aslen;
+
+    snlen = snprintf(snbuf, sizeof(snbuf), "%s: %d\n", program_name, r);
+    aslen = XtAsprintf(&asbuf, "%s: %d\n", program_name, r);
+
+    g_assert(asbuf != NULL);
+    g_assert(snlen == aslen);
+    g_assert(strcmp(snbuf, asbuf) == 0);
+    g_assert(asbuf[aslen] == '\0');
+}
+
+/* Test a string long enough to be past the 256 character limit that
+   makes XtAsprintf re-run snprintf after allocating memory */
+static void test_XtAsprintf_long(void)
+{
+    char *asbuf;
+    int aslen;
+    gint r1 = g_test_rand_int_range(0, 256);
+    gint r2 = g_test_rand_int_range(1024, sizeof(test_chars) - r1);
+
+    aslen = XtAsprintf(&asbuf, "%.*s", r2, test_chars + r1);
+
+    g_assert(asbuf != NULL);
+    g_assert(aslen == r2);
+    g_assert(strncmp(asbuf, test_chars + r1, r2) == 0);
+    g_assert(asbuf[aslen] == '\0');
+}
+
+int main(int argc, char** argv)
+{
+    program_name = argv[0];
+
+    g_test_init(&argc, &argv, NULL);
+    g_test_bug_base("https://bugzilla.freedesktop.org/show_bug.cgi?id=");
+
+    g_test_add_func("/Alloc/XtAsprintf/short", test_XtAsprintf_short);
+    g_test_add_func("/Alloc/XtAsprintf/long", test_XtAsprintf_long);
+
+    return g_test_run();
+}
diff --git a/test/Converters.c b/test/Converters.c
new file mode 100644 (file)
index 0000000..46e7f5a
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * 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 (including the next
+ * paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+ */
+
+#include <X11/Intrinsic.h>
+#include <glib.h>
+
+/* Test for Solaris bug 4163152 XtCvtIntToPixmap() gets a SIGBUS in 64-bit
+   Fixed by libXt commit 16d9941f3aa38dde115cbff639e131761c1b36d0
+ */
+static void test_XtCvtIntToPixmap(void)
+{
+    Display         *display = NULL; /* not actually used */
+    Boolean         status;
+    XrmValue        args[2];
+    Cardinal        num_args;
+    XrmValue        fromVal;
+    XrmValue        toVal;
+    Pixmap          res;
+    XtPointer       *closure_ret = NULL;
+    int             num[2];
+
+
+    XtToolkitInitialize();
+
+    num[0] = 7;
+    num[1] = -1;
+
+    num_args = 0;
+    fromVal.addr = (XtPointer) num;
+    fromVal.size = sizeof(int);
+    toVal.addr = (XtPointer) &res;
+    toVal.size = sizeof(Pixmap);
+
+    status = XtCvtIntToPixmap(display, &args[0], &num_args,
+                             &fromVal, &toVal, closure_ret);
+
+    g_assert(res == num[0]);
+
+
+    num[0] = -1;
+    num[1] = 7;
+
+    num_args = 0;
+    fromVal.addr = (XtPointer) (&num[1]);
+    fromVal.size = sizeof(int);
+    toVal.addr = (XtPointer) &res;
+    toVal.size = sizeof(Pixmap);
+
+    status = XtCvtIntToPixmap(display, &args[0], &num_args,
+                             &fromVal, &toVal, closure_ret);
+
+    g_assert(res == num[1]);
+}
+
+int main(int argc, char** argv)
+{
+    g_test_init(&argc, &argv, NULL);
+    g_test_bug_base("https://bugzilla.freedesktop.org/show_bug.cgi?id=");
+
+    g_test_add_func("/Converters/XtCvtIntToPixmap", test_XtCvtIntToPixmap);
+
+    return g_test_run();
+}
diff --git a/test/Event.c b/test/Event.c
new file mode 100644 (file)
index 0000000..bd80c8c
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * 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 (including the next
+ * paragraph) 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+ */
+
+#include <X11/Intrinsic.h>
+#include <glib.h>
+#include <unistd.h>
+#include <signal.h>
+#include <setjmp.h>
+
+/* Test XtAppMainLoop without a display doesn't wait for an XEvent.
+   Based on https://bugs.freedesktop.org/show_bug.cgi?id=34715 */
+static void _Tick(XtPointer baton, XtIntervalId* id)
+{
+    static int count = 0;
+    XtAppContext app = (XtAppContext)baton;
+
+    count ++;
+#ifdef DEBUG
+    printf("%d beep!\n", count);
+#endif
+
+    if (3 == count)
+        XtAppSetExitFlag(app);
+    else
+        XtAppAddTimeOut(app, 1000, _Tick, app);
+}
+
+static sigjmp_buf jump_env;
+
+static void sigalrm (int sig)
+{
+    siglongjmp(jump_env, 1);
+}
+
+static void test_XtAppMainLoop_34715(void)
+{
+    XtAppContext app;
+    struct sigaction sa;
+
+    XtToolkitInitialize();
+    app = XtCreateApplicationContext();
+    XtAppAddTimeOut(app, 1000, _Tick, app);
+
+    /* AppTimeouts should finish and exit in 3 seconds.
+       Give them 10 seconds just in case system is busy, then fail. */
+    sa.sa_handler = sigalrm;
+    sa.sa_flags = SA_RESTART;
+    sigemptyset (&sa.sa_mask);
+
+    if (sigsetjmp(jump_env, 1) == 0) {
+       sigaction(SIGALRM, &sa, NULL);
+       alarm(10);
+
+       XtAppMainLoop(app);
+    } else {
+       g_assert(XtAppGetExitFlag(app) == TRUE);
+       g_assert(0 /* timed out */);
+    }
+    g_assert(XtAppGetExitFlag(app) == TRUE);
+    XtDestroyApplicationContext(app);
+}
+
+int main(int argc, char** argv)
+{
+    g_test_init(&argc, &argv, NULL);
+    g_test_bug_base("https://bugzilla.freedesktop.org/show_bug.cgi?id=");
+
+    g_test_add_func("/Event/XtAppMainLoop/34715", test_XtAppMainLoop_34715);
+
+    return g_test_run();
+}
diff --git a/test/Makefile.am b/test/Makefile.am
new file mode 100644 (file)
index 0000000..7494c41
--- /dev/null
@@ -0,0 +1,14 @@
+if ENABLE_UNIT_TESTS
+if HAVE_GLIB
+check_PROGRAMS = Alloc Converters Event
+
+TESTS=$(check_PROGRAMS)
+
+AM_CFLAGS = $(CWARNFLAGS) $(XT_CFLAGS) $(GLIB_CFLAGS)
+INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/include
+LDADD= $(top_builddir)/src/libXt.la $(GLIB_LIBS)
+
+TESTS_ENVIRONMENT = $(MALLOC_DEBUG_ENV)
+
+endif HAVE_GLIB
+endif ENABLE_UNIT_TESTS
diff --git a/util/Makefile.am b/util/Makefile.am
new file mode 100644 (file)
index 0000000..dedfa6b
--- /dev/null
@@ -0,0 +1,31 @@
+noinst_PROGRAMS = makestrs
+
+CC = @CC_FOR_BUILD@
+CFLAGS = @CFLAGS_FOR_BUILD@
+LDFLAGS = @LDFLAGS_FOR_BUILD@
+
+EXTRA_DIST = \
+       Shell.ht \
+       StrDefs.ct \
+       StrDefs.ht \
+       string.list
+
+AM_CFLAGS = $(XT_CFLAGS)
+makestrs_SOURCES = makestrs.c
+
+
+# Man page
+appmandir = $(APP_MAN_DIR)
+
+appman_PRE = makestrs.man
+
+noinst_DATA = $(appman_PRE:man=@APP_MAN_SUFFIX@)
+
+EXTRA_DIST += $(appman_PRE)
+CLEANFILES = $(noinst_DATA)
+
+SUFFIXES = .$(APP_MAN_SUFFIX) .man
+
+# String replacements in MAN_SUBSTS now come from xorg-macros.m4 via configure
+.man.$(APP_MAN_SUFFIX):
+       $(AM_V_GEN)$(SED) $(MAN_SUBSTS) < $< > $@
diff --git a/util/Shell.ht b/util/Shell.ht
new file mode 100644 (file)
index 0000000..500e0fd
--- /dev/null
@@ -0,0 +1,94 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifndef _XtShell_h
+#define _XtShell_h
+
+#include <X11/SM/SMlib.h>
+#include <X11/Intrinsic.h>
+
+/***********************************************************************
+ *
+ * Shell Widget
+ *
+ ***********************************************************************/
+/*
+ * Shell-specific resources names, classes, and a representation type.
+ */
+
+#ifndef XTSTRINGDEFINES
+#define _XtShell_h_Const const
+#endif
+
+<<<STRING_TABLE_GOES_HERE>>>
+
+#ifndef XTSTRINGDEFINES
+#undef _XtShell_h_Const
+#endif
+
+/* Class record constants */
+
+typedef struct _ShellClassRec *ShellWidgetClass;
+typedef struct _OverrideShellClassRec *OverrideShellWidgetClass;
+typedef struct _WMShellClassRec *WMShellWidgetClass;
+typedef struct _TransientShellClassRec *TransientShellWidgetClass;
+typedef struct _TopLevelShellClassRec *TopLevelShellWidgetClass;
+typedef struct _ApplicationShellClassRec *ApplicationShellWidgetClass;
+typedef struct _SessionShellClassRec *SessionShellWidgetClass;
+
+#ifndef SHELL
+externalref WidgetClass shellWidgetClass;
+externalref WidgetClass overrideShellWidgetClass;
+externalref WidgetClass wmShellWidgetClass;
+externalref WidgetClass transientShellWidgetClass;
+externalref WidgetClass topLevelShellWidgetClass;
+externalref WidgetClass applicationShellWidgetClass;
+externalref WidgetClass sessionShellWidgetClass;
+#endif
+
+#endif /* _XtShell_h */
+/* DON'T ADD STUFF AFTER THIS #endif */
diff --git a/util/StrDefs.ct b/util/StrDefs.ct
new file mode 100644 (file)
index 0000000..b597b20
--- /dev/null
@@ -0,0 +1,51 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#define Const const
+
+<<<STRING_TABLE_GOES_HERE>>>
+
diff --git a/util/StrDefs.ht b/util/StrDefs.ht
new file mode 100644 (file)
index 0000000..2ce2056
--- /dev/null
@@ -0,0 +1,61 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear 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 advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifndef _XtStringDefs_h_
+#define _XtStringDefs_h_
+
+#ifndef XTSTRINGDEFINES
+#define _XtStringDefs_h_Const const
+#endif
+
+<<<STRING_TABLE_GOES_HERE>>>
+
+#ifndef XTSTRINGDEFINES
+#undef _XtStringDefs_h_Const
+#endif
+
+#endif /* _XtStringDefs_h_ */
diff --git a/util/makestrs.c b/util/makestrs.c
new file mode 100644 (file)
index 0000000..a52866a
--- /dev/null
@@ -0,0 +1,746 @@
+/*
+
+Copyright (c) 1991, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+/* Constructs string definitions */
+
+#include <stdio.h>
+#include <X11/Xos.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+typedef struct _TableEnt {
+    struct _TableEnt* next;
+    char* left;
+    char* right;
+    int offset;
+} TableEnt;
+
+typedef struct _Table {
+    struct _Table* next;
+    TableEnt* tableent;
+    TableEnt* tableentcurrent;
+    TableEnt** tableenttail;
+    char* name;
+    int offset;
+} Table;
+
+typedef struct _File {
+    struct _File* next;
+    FILE* tmpl;
+    char* name;
+    Table* table;
+    Table* tablecurrent;
+    Table** tabletail;
+} File;
+
+static File* file = NULL;
+static File* filecurrent = NULL;
+static File** filetail = &file;
+static char* conststr;
+static char* prefixstr = NULL;
+static char* featurestr = NULL;
+static char* ctmplstr = NULL;
+static char* fileprotstr;
+static char* externrefstr;
+static char* externdefstr;
+
+#ifndef FALSE
+# define FALSE 0
+# define TRUE  !(FALSE)
+#endif
+
+static int   solaris_abi_names = FALSE;
+
+#define X_DEFAULT_ABI  0
+#define X_ARRAYPER_ABI 1
+#define X_INTEL_ABI    2
+#define X_INTEL_ABI_BC 3
+#define X_SPARC_ABI    4
+#define X_FUNCTION_ABI 5
+
+#define X_MAGIC_STRING "<<<STRING_TABLE_GOES_HERE>>>"
+
+/* Wrapper for fopen()
+ * Prepend filename with an includedir which can be specified on the
+ * commandline. Needed to separate source and build directories.
+ */
+static char* includedir = NULL;
+static FILE *ifopen(const char *file, const char *mode)
+{
+    size_t len;
+    char *buffer;
+    FILE *ret;
+
+    if (includedir == NULL)
+        return fopen(file, mode);
+
+    len = strlen(file) + strlen(includedir) + 1;
+    buffer = (char*)malloc(len + 1);
+    if (buffer == NULL)
+        return NULL;
+
+    strcpy(buffer, includedir);
+    strcat(buffer, "/");
+    strcat(buffer, file);
+
+    ret = fopen(buffer, mode);
+
+    free(buffer);
+    return ret;
+}
+
+static void WriteHeaderProlog (FILE *f, File *phile)
+{
+    Table* t;
+    TableEnt* te;
+
+    (void) fprintf (f, "#ifdef %s\n", featurestr);
+    for (t = phile->table; t; t = t->next)
+       for (te = t->tableent; te; te = te->next) {
+           if (strcmp (te->left, "RAtom") == 0) {
+               (void) fprintf (f,
+                       "#ifndef %s%s\n#define %s%s \"%s\"\n#endif\n",
+                       prefixstr, te->left, prefixstr, te->left, te->right);
+           } else {
+               (void) fprintf (f,
+                       "#define %s%s \"%s\"\n",
+                       prefixstr, te->left, te->right);
+           }
+       }
+    (void) fprintf (f, "%s", "#else\n");
+}
+
+static void IntelABIWriteHeader (FILE *f, File *phile)
+{
+    Table* t;
+    TableEnt* te;
+
+    WriteHeaderProlog (f, phile);
+
+    for (t = phile->table; t; t = t->next) {
+      (void) fprintf (f, "%s %sConst char %s[];\n",
+                     externrefstr, conststr ? conststr : fileprotstr, t->name);
+       for (te = t->tableent; te; te = te->next)
+           (void) fprintf (f,
+               "#ifndef %s%s\n#define %s%s ((char*)&%s[%d])\n#endif\n",
+               prefixstr, te->left, prefixstr, te->left, t->name, te->offset);
+    }
+
+    (void) fprintf (f, "#endif /* %s */\n", featurestr);
+}
+
+static void SPARCABIWriteHeader (FILE *f, File *phile)
+{
+    Table* t;
+    TableEnt* te;
+
+    for (t = phile->table; t; t = t->next)
+       for (te = t->tableent; te; te = te->next)
+           (void) fprintf (f, "#define %s%s \"%s\"\n",
+                           prefixstr, te->left, te->right);
+}
+
+static void FunctionWriteHeader (FILE *f, File *phile)
+{
+    Table* t;
+    TableEnt* te;
+
+    WriteHeaderProlog (f, phile);
+
+    (void) fprintf (f, "%s %sConst char* %s();\n",
+                   externrefstr, conststr ? conststr : fileprotstr,
+                   phile->table->name);
+
+    for (t = phile->table; t; t = t->next)
+       for (te = t->tableent; te; te = te->next)
+           (void) fprintf (f,
+               "#ifndef %s%s\n#define %s%s (%s(%d))\n#endif\n",
+               prefixstr, te->left, prefixstr, te->left, phile->table->name,
+               te->offset);
+
+    (void) fprintf (f, "#endif /* %s */\n", featurestr);
+}
+
+static void ArrayperWriteHeader (FILE *f, File *phile)
+{
+    Table* t;
+    TableEnt* te;
+
+    WriteHeaderProlog (f, phile);
+
+    for (t = phile->table; t; t = t->next)
+        for (te = t->tableent; te; te = te->next)
+           (void) fprintf (f,
+                           "#ifndef %s%s\n%s %sConst char %s%s[];\n#endif\n",
+                           prefixstr, te->left,
+                           externrefstr, conststr ? conststr : fileprotstr,
+                           prefixstr, te->left);
+
+    (void) fprintf (f, "#endif /* %s */\n", featurestr);
+}
+
+static void DefaultWriteHeader (FILE *f, File *phile)
+{
+    Table* t;
+    TableEnt* te;
+
+    WriteHeaderProlog (f, phile);
+
+    (void) fprintf (f, "%s %sConst char %s[];\n",
+                   externrefstr, conststr ? conststr : fileprotstr,
+                   phile->table->name);
+
+    for (t = phile->table; t; t = t->next)
+       for (te = t->tableent; te; te = te->next)
+           (void) fprintf (f,
+               "#ifndef %s%s\n#define %s%s ((char*)&%s[%d])\n#endif\n",
+               prefixstr, te->left, prefixstr, te->left, phile->table->name,
+               te->offset);
+
+    (void) fprintf (f, "#endif /* %s */\n", featurestr);
+}
+
+static void CopyTmplProlog (FILE *tmpl, FILE *f)
+{
+    char buf[1024];
+    static const char* magic_string = X_MAGIC_STRING;
+    int magic_string_len = strlen (magic_string);
+
+    while (fgets (buf, sizeof buf, tmpl)) {
+       if (strncmp (buf, magic_string, magic_string_len) == 0) {
+           return;
+       }
+       (void) fputs (buf, f);
+    }
+}
+
+static void CopyTmplEpilog (FILE *tmpl, FILE *f)
+{
+    char buf[1024];
+
+    while (fgets (buf, sizeof buf, tmpl))
+       (void) fputs (buf, f);
+}
+
+static const char* abistring[] = {
+    "Default", "Array per string", "Intel", "Intel BC", "SPARC", "Function" };
+
+static void WriteHeader (char *tagline, File *phile, int abi)
+{
+    FILE* f;
+    char* tmp;
+    static void (*headerproc[])(FILE *f, File *phile) = {
+       DefaultWriteHeader, ArrayperWriteHeader,
+       IntelABIWriteHeader, IntelABIWriteHeader,
+       SPARCABIWriteHeader, FunctionWriteHeader };
+
+    if ((f = fopen (phile->name, "w+")) == NULL) exit (1);
+
+    if (phile->tmpl) CopyTmplProlog (phile->tmpl, f);
+
+    (void) fprintf (f,
+       "%s\n%s\n/* %s ABI version -- Do not edit */\n",
+       "/* $Xorg: makestrs.c,v 1.6 2001/02/09 02:03:17 xorgcvs Exp $ */",
+       "/* This file is automatically generated. */",
+       abistring[abi]);
+
+    if (tagline) (void) fprintf (f, "/* %s */\n\n", tagline);
+
+    /* do the right thing for Motif, i.e. avoid _XmXmStrDefs_h_ */
+    if (strcmp (prefixstr, "Xm") == 0) {
+       if ((fileprotstr = malloc (strlen (phile->name) + 3)) == NULL)
+          exit (1);
+       (void) sprintf (fileprotstr, "_%s_", phile->name);
+    } else {
+       if ((fileprotstr = malloc (strlen (phile->name) + strlen (prefixstr) +  3)) == NULL)
+          exit (1);
+       (void) sprintf (fileprotstr, "_%s%s_", prefixstr, phile->name);
+    }
+
+    for (tmp = fileprotstr; *tmp; tmp++) if (*tmp == '.') *tmp = '_';
+
+    (*headerproc[abi])(f, phile);
+
+    if (phile->tmpl) CopyTmplEpilog (phile->tmpl, f);
+
+    (void) free (fileprotstr);
+    (void) fclose (phile->tmpl);
+    (void) fclose (f);
+}
+
+static void WriteSourceLine (TableEnt *te, int abi, int fudge)
+{
+    char* c;
+
+    for (c = te->right; *c; c++) (void) printf ("'%c',", *c);
+    (void) printf ("%c", '0');
+    if (te->next || fudge) (void) printf ("%c", ',');
+    (void) printf ("%s", "\n");
+}
+
+static const char* const_string = "%s %sConst char %s[] = {\n";
+
+static void IntelABIWriteSource (int abi)
+{
+    File* phile;
+
+    for (phile = file; phile; phile = phile->next) {
+       Table* t;
+       TableEnt* te;
+
+       for (t = phile->table; t; t = t->next) {
+           (void) printf (const_string, externdefstr,
+                          conststr ? conststr : "", t->name);
+           for (te = t->tableent; te; te = te->next)
+               WriteSourceLine (te, abi, 0);
+           (void) printf ("%s\n\n", "};");
+       }
+    }
+}
+
+static void IntelABIBCWriteSource (int abi)
+{
+    File* phile;
+
+    for (phile = file; phile; phile = phile->next) {
+       Table* t;
+       TableEnt* te;
+
+       (void) printf (const_string, externdefstr,
+                      conststr ? conststr : "", phile->table->name);
+
+       for (t = phile->table; t; t = t->next)
+           for (te = t->tableent; te; te = te->next)
+               WriteSourceLine (te, abi, t->next ? 1 : 0);
+       (void) printf ("%s\n\n", "};");
+
+       if (phile->table->next) {
+           (void) printf (const_string, externdefstr,
+                          conststr ? conststr : "", phile->table->next->name);
+           for (t = phile->table->next; t; t = t->next)
+               for (te = t->tableent; te; te = te->next)
+                   WriteSourceLine (te, abi, 0);
+           (void) printf ("%s\n\n", "};");
+       }
+    }
+}
+
+static void FunctionWriteSource (int abi)
+{
+    File* phile;
+
+    for (phile = file; phile; phile = phile->next) {
+       Table* t;
+       TableEnt* te;
+
+       (void) printf ("static %sConst char _%s[] = {\n",
+                      conststr ? conststr : "", phile->table->name);
+
+       for (t = phile->table; t; t = t->next)
+           for (te = t->tableent; te; te = te->next)
+               WriteSourceLine (te, abi, t->next ? 1 : 0);
+       (void) printf ("%s\n\n", "};");
+
+       (void) printf ("%sConst char* %s(index)\n    int index;\n{\n    return &_%s[index];\n}\n\n",
+                      conststr ? conststr : "",
+                      phile->table->name, phile->table->name);
+    }
+}
+
+static void ArrayperWriteSource (int abi)
+{
+    File* phile;
+    static int done_atom;
+
+    for (phile = file; phile; phile = phile->next) {
+       Table* t;
+       TableEnt* te;
+
+       for (t = phile->table; t; t = t->next)
+           for (te = t->tableent; te; te = te->next) {
+               if (strcmp (te->left, "RAtom") == 0) {
+                   if (done_atom) return;
+                   done_atom = 1;
+               }
+               (void) printf ("%s %sConst char %s%s[] = \"%s\";\n",
+                              externdefstr, conststr ? conststr : "",
+                              prefixstr,
+                              te->left, te->right);
+           }
+    }
+}
+
+static void DefaultWriteSource (int abi)
+{
+    File* phile;
+
+    for (phile = file; phile; phile = phile->next) {
+       Table* t;
+       TableEnt* te;
+
+       (void) printf (const_string, externdefstr, conststr ? conststr : "",
+                      phile->table->name);
+
+       for (t = phile->table; t; t = t->next)
+           for (te = t->tableent; te; te = te->next)
+               WriteSourceLine (te, abi, t->next ? 1 : 0);
+       (void) printf ("%s\n\n", "};");
+    }
+}
+
+static void WriteSource(char *tagline, int abi)
+{
+    static void (*sourceproc[])(int) = {
+       DefaultWriteSource, ArrayperWriteSource,
+       IntelABIWriteSource, IntelABIBCWriteSource,
+       DefaultWriteSource, FunctionWriteSource };
+
+    FILE* tmpl;
+
+    if (ctmplstr) {
+       tmpl = ifopen (ctmplstr, "r");
+
+       if (tmpl) CopyTmplProlog (tmpl, stdout);
+       else {
+           (void) fprintf (stderr, "Expected template %s, not found\n",
+                           ctmplstr);
+           exit (1);
+       }
+    } else
+       tmpl = NULL;
+
+
+    (void) printf ("%s\n%s\n/* %s ABI version -- Do not edit */\n",
+                  "/* $Xorg: makestrs.c,v 1.6 2001/02/09 02:03:17 xorgcvs Exp $ */",
+                  "/* This file is automatically generated. */",
+                  abistring[abi]);
+
+    if (tagline) (void) printf ("/* %s */\n\n", tagline);
+
+    (*sourceproc[abi])(abi);
+
+    if (tmpl) CopyTmplEpilog (tmpl, stdout);
+}
+
+static void DoLine(char *buf)
+{
+#define X_NO_TOKEN 0
+#define X_FILE_TOKEN 1
+#define X_TABLE_TOKEN 2
+#define X_PREFIX_TOKEN 3
+#define X_FEATURE_TOKEN 4
+#define X_EXTERNREF_TOKEN 5
+#define X_EXTERNDEF_TOKEN 6
+#define X_CTMPL_TOKEN 7
+#define X_HTMPL_TOKEN 8
+#define X_CONST_TOKEN 9
+
+    int token;
+    char lbuf[1024];
+    static const char* file_str = "#file";
+    static const char* table_str = "#table";
+    static const char* prefix_str = "#prefix";
+    static const char* feature_str = "#feature";
+    static const char* externref_str = "#externref";
+    static const char* externdef_str = "#externdef";
+    static const char* ctmpl_str = "#ctmpl";
+    static const char* htmpl_str = "#htmpl";
+    static const char* const_str = "#const";
+
+    if (strncmp (buf, file_str, strlen (file_str)) == 0)
+       token = X_FILE_TOKEN;
+    else if (strncmp (buf, table_str, strlen (table_str)) == 0)
+       token = X_TABLE_TOKEN;
+    else if (strncmp (buf, prefix_str, strlen (prefix_str)) == 0)
+       token = X_PREFIX_TOKEN;
+    else if (strncmp (buf, feature_str, strlen (feature_str)) == 0)
+       token = X_FEATURE_TOKEN;
+    else if (strncmp (buf, externref_str, strlen (externref_str)) == 0)
+       token = X_EXTERNREF_TOKEN;
+    else if (strncmp (buf, externdef_str, strlen (externdef_str)) == 0)
+       token = X_EXTERNDEF_TOKEN;
+    else if (strncmp (buf, ctmpl_str, strlen (ctmpl_str)) == 0)
+       token = X_CTMPL_TOKEN;
+    else if (strncmp (buf, htmpl_str, strlen (htmpl_str)) == 0)
+       token = X_HTMPL_TOKEN;
+    else if (strncmp (buf, const_str, strlen (const_str)) == 0)
+       token = X_CONST_TOKEN;
+    else
+        token = X_NO_TOKEN;
+
+    switch (token) {
+    case X_FILE_TOKEN:
+       {
+           File* phile;
+
+           if ((phile = (File*) malloc (sizeof(File))) == NULL)
+               exit(1);
+           if ((phile->name = malloc (strlen (buf + strlen (file_str)) + 1)) == NULL)
+               exit(1);
+           (void) strcpy (phile->name, buf + strlen (file_str) + 1);
+           phile->table = NULL;
+           phile->tablecurrent = NULL;
+           phile->tabletail = &phile->table;
+           phile->next = NULL;
+           phile->tmpl = NULL;
+
+           *filetail = phile;
+           filetail = &phile->next;
+           filecurrent = phile;
+       }
+       break;
+    case X_TABLE_TOKEN:
+       {
+           Table* table;
+           if ((table = (Table*) malloc (sizeof(Table))) == NULL)
+               exit(1);
+           if ((table->name = malloc (strlen (buf + strlen (table_str)) + 1)) == NULL)
+               exit(1);
+           (void) strcpy (table->name, buf + strlen (table_str) + 1);
+           if (solaris_abi_names) {
+               if (strcmp(table->name, "XtStringsR6") == 0) {
+                   strcpy(table->name, "XtR6Strings");
+               } else if (strcmp(table->name, "XtShellStringsR6") == 0) {
+                   strcpy(table->name, "XtR6ShellStrings");
+               }
+           }
+           table->tableent = NULL;
+           table->tableentcurrent = NULL;
+           table->tableenttail = &table->tableent;
+           table->next = NULL;
+           table->offset = 0;
+
+           *filecurrent->tabletail = table;
+           filecurrent->tabletail = &table->next;
+           filecurrent->tablecurrent = table;
+       }
+       break;
+    case X_PREFIX_TOKEN:
+       if ((prefixstr = malloc (strlen (buf + strlen (prefix_str)) + 1)) == NULL)
+           exit(1);
+       (void) strcpy (prefixstr, buf + strlen (prefix_str) + 1);
+       break;
+    case X_FEATURE_TOKEN:
+       if ((featurestr = malloc (strlen (buf + strlen (feature_str)) + 1)) == NULL)
+           exit(1);
+       (void) strcpy (featurestr, buf + strlen (feature_str) + 1);
+       break;
+    case X_EXTERNREF_TOKEN:
+       if ((externrefstr = malloc (strlen (buf + strlen (externref_str)) + 1)) == NULL)
+           exit(1);
+       (void) strcpy (externrefstr, buf + strlen (externref_str) + 1);
+       break;
+    case X_EXTERNDEF_TOKEN:
+       if ((externdefstr = malloc (strlen (buf + strlen (externdef_str)) + 1)) == NULL)
+           exit(1);
+       (void) strcpy (externdefstr, buf + strlen (externdef_str) + 1);
+       break;
+    case X_CTMPL_TOKEN:
+       if ((ctmplstr = malloc (strlen (buf + strlen (ctmpl_str)) + 1)) == NULL)
+           exit(1);
+       (void) strcpy (ctmplstr, buf + strlen (ctmpl_str) + 1);
+       break;
+    case X_HTMPL_TOKEN:
+       if ((filecurrent->tmpl = ifopen (buf + strlen (htmpl_str) + 1, "r")) == NULL) {
+           (void) fprintf (stderr,
+                           "Expected template %s, not found\n", htmpl_str);
+           exit (1);
+       }
+       break;
+    case X_CONST_TOKEN:
+       if ((conststr = malloc (strlen (buf + strlen (const_str)) + 1)) == NULL)
+           exit(1);
+       (void) strcpy (conststr, buf + strlen (const_str) + 1);
+       break;
+    default:
+       {
+           char* right;
+           TableEnt* tableent;
+           int llen;
+           int rlen;
+           int len;
+
+           if ((right = index(buf, ' ')))
+               *right++ = 0;
+           else
+               right = buf + 1;
+           if (buf[0] == 'H') {
+               strcpy (lbuf, prefixstr);
+               strcat (lbuf, right);
+               right = lbuf;
+           }
+
+           llen = len = strlen(buf) + 1;
+           rlen = strlen(right) + 1;
+           if (right != buf + 1) len += rlen;
+           if ((tableent = (TableEnt*)malloc(sizeof(TableEnt) + len)) == NULL)
+               exit(1);
+           tableent->left = (char *)(tableent + 1);
+           strcpy(tableent->left, buf);
+           if (llen != len) {
+               tableent->right = tableent->left + llen;
+               strcpy(tableent->right, right);
+           } else {
+               tableent->right = tableent->left + 1;
+           }
+           tableent->next = NULL;
+
+           *filecurrent->tablecurrent->tableenttail = tableent;
+           filecurrent->tablecurrent->tableenttail = &tableent->next;
+           filecurrent->tablecurrent->tableentcurrent = tableent;
+       }
+       break;
+    }
+}
+
+static void IntelABIIndexEntries (File *file)
+{
+    Table* t;
+    TableEnt* te;
+
+    for (t = file->table; t; t = t->next)
+       for (te = t->tableent; te; te = te->next) {
+           te->offset = t->offset;
+           t->offset += strlen (te->right);
+           t->offset++;
+    }
+}
+
+static void DefaultIndexEntries (File *file)
+{
+    Table* t;
+    TableEnt* te;
+    int offset = 0;
+
+    for (t = file->table; t; t = t->next)
+       for (te = t->tableent; te; te = te->next) {
+           te->offset = offset;
+           offset += strlen (te->right);
+           offset++;
+    }
+}
+
+static void IndexEntries (File *file, int abi)
+{
+    switch (abi) {
+    case X_SPARC_ABI:
+       break;
+    case X_INTEL_ABI:
+    case X_INTEL_ABI_BC:
+       IntelABIIndexEntries (file);
+       break;
+    default:
+       DefaultIndexEntries (file);
+       break;
+    }
+}
+
+static char* DoComment (char *line)
+{
+    char* tag;
+    char* eol;
+    char* ret;
+    int len;
+
+    /* assume that the first line with two '$' in it is the RCS tag line */
+    if ((tag = index (line, '$')) == NULL) return NULL;
+    if ((eol = index (tag + 1, '$')) == NULL) return NULL;
+    len = eol - tag;
+    if ((ret = malloc (len)) == NULL)
+       exit (1);
+    (void) strncpy (ret, tag + 1, len - 1);
+    ret[len - 2] = 0;
+    return ret;
+}
+
+int main(int argc, char *argv[])
+{
+    int len, i;
+    char* tagline = NULL;
+    File* phile;
+    FILE *f;
+    char buf[1024];
+    int abi =
+#ifndef ARRAYPERSTR
+       X_DEFAULT_ABI;
+#else
+       X_ARRAYPER_ABI;
+#endif
+
+    f = stdin;
+    if (argc > 1) {
+       for (i = 1; i < argc; i++) {
+           if (strcmp (argv[i], "-f") == 0) {
+               if (++i < argc)
+                   f = fopen (argv[i], "r");
+               else
+                   return 1;
+           }
+           if (strcmp (argv[i], "-i") == 0) {
+               if (++i < argc)
+                   includedir = argv[i];
+               else
+                   return 1;
+           }
+           if (strcmp (argv[i], "-sparcabi") == 0)
+               abi = X_SPARC_ABI;
+           if (strcmp (argv[i], "-intelabi") == 0)
+               abi = X_INTEL_ABI;
+           if (strcmp (argv[i], "-functionabi") == 0)
+               abi = X_FUNCTION_ABI;
+           if (strcmp (argv[i], "-earlyR6bc") == 0 && abi == X_INTEL_ABI)
+               abi = X_INTEL_ABI_BC;
+           if (strcmp (argv[i], "-arrayperabi") == 0)
+               abi = X_ARRAYPER_ABI;
+#ifdef ARRAYPERSTR
+           if (strcmp (argv[i], "-defaultabi") == 0)
+               abi = X_DEFAULT_ABI;
+#endif
+           if (strcmp (argv[i], "-solarisabinames") == 0)
+               solaris_abi_names = TRUE;
+       }
+    }
+
+    if (f == NULL) return 1;
+    while (fgets(buf, sizeof buf, f)) {
+       if (!buf[0] || buf[0] == '\n')
+           continue;
+       if (buf[0] == '!') {
+           if (tagline) continue;
+           tagline = DoComment (buf);
+           continue;
+       }
+       if (buf[(len = strlen (buf) - 1)] == '\n') buf[len] = '\0';
+       DoLine(buf);
+    }
+    for (phile = file; phile; phile = phile->next) {
+       if (abi != X_ARRAYPER_ABI) IndexEntries (phile, abi);
+       WriteHeader (tagline, phile, abi);
+    }
+    WriteSource(tagline, abi);
+    return 0;
+}
+
diff --git a/util/makestrs.man b/util/makestrs.man
new file mode 100644 (file)
index 0000000..83027fd
--- /dev/null
@@ -0,0 +1,216 @@
+.\" Copyright (c) 1993, 1994, 1998 The Open Group
+.\"
+.\" Permission to use, copy, modify, distribute, and sell this software and its
+.\" documentation for any purpose is hereby granted without fee, provided that
+.\" the above copyright notice appear in all copies and that both that
+.\" copyright notice and this permission notice appear in supporting
+.\" documentation.
+.\"
+.\" 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 OPEN GROUP 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 Open Group shall not
+.\" be used in advertising or otherwise to promote the sale, use or other
+.\" dealing in this Software without prior written authorization from The
+.\" Open Group.
+.\"
+.TH MAKESTRS 1 __xorgversion__
+.SH NAME
+makestrs \- makes string table C source and header(s)
+.SH SYNOPSIS
+.B makestrs [-f source] [-i includedir] [-abioptions ...]
+.SH DESCRIPTION
+The
+.I makestrs
+command creates string table C source files and headers.
+If
+.I -f
+.I source
+is not specified
+.I makestrs
+will read from
+.IR stdin .
+The C source file is always written to
+.IR stdout .
+.I makestrs
+creates one or more C header files as specified in the source file.
+The following options may be specified:
+.IR -sparcabi ,
+.IR -intelabi ,
+.IR -functionabi ,
+.IR -arrayperabi ,
+and
+.I -defaultabi.
+.LP
+.I -sparcabi
+is used on SPARC platforms conforming to the SPARC
+Compliance Definition, i.e. SVR4/Solaris.
+.LP
+.I -intelabi
+is used on Intel platforms conforming to the System
+V Application Binary Interface, i.e. SVR4.
+.LP
+.I -earlyR6abi
+may be used in addition to
+.I -intelabi
+for situations
+where the vendor wishes to maintain binary compatibility between
+X11R6 public-patch 11 (and earlier) and X11R6 public-patch 12 (and later).
+.LP
+.I -functionabi
+generates a functional abi to the string table. This
+mechanism imposes a severe performance penalty and it's recommended
+that you not use it.
+.LP
+.I -arrayperabi
+results in a separate array for each string. This is
+the default behavior if makestrs was compiled with -DARRAYPERSTR
+(it almost never is).
+.LP
+.I -defaultabi
+forces the generation of the "normal" string table even
+if makestrs was compiled with -DARRAYPERSTR. Since makestrs is almost
+never compiled with -DARRAYPERSTR this is the default behavior if
+no abioptions are specified.
+.LP
+.I -i includedir
+forces the reading of templates from the includedir instead of the local
+directory. This is useful to have separate source and build directories.
+.SH SYNTAX
+The syntax for string-list file is (items in square brackets are optional):
+.RS 4
+\&#prefix <text>
+.RE
+.RS 4
+\&#feature <text>
+.RE
+.RS 4
+\&#externref <text>
+.RE
+.RS 4
+\&#externdef [<text>]
+.RE
+.RS 4
+[#ctempl <text>]
+.RE
+.LP
+.RS 4
+\&#file <filename>
+.RE
+.RS 4
+\&#table <tablename>
+.RE
+.RS 4
+[#htempl]
+.RE
+.RS 4
+<text>
+.RE
+.RS 4
+\&...
+.RE
+.RS 4
+<text>
+.RE
+.RS 4
+[#table <tablename>
+.RE
+.RS 4
+<text>
+.RE
+.RS 4
+\&...
+.RE
+.RS 4
+<text>
+.RE
+.RS 4
+\& ...
+.RE
+.RS 4
+\&#table <tablename>
+.RE
+.RS 4
+\& ...]
+.RE
+.RS 4
+[#file <filename>
+.RE
+.RS 4
+\& ...]
+.RE
+.LP
+In words you may have one or more #file directives. Each #file may have
+one or more #table directives.
+.LP
+The #prefix directive determines the string that makestr will prefix
+to each definition.
+.LP
+The #feature directive determines the string that makestr will use
+for the feature-test macro, e.g. X[TM]STRINGDEFINES.
+.LP
+The #externref directive determines the string that makestr will use
+for the extern clause, typically this will be "extern" but Motif wants
+it to be "externalref"
+.LP
+The #externdef directive determines the string that makestr will use
+for the declaration, typically this will be the null string (note that
+makestrs requires a trailing space in this case, i.e. "#externdef "),
+and Motif will use "externaldef(_xmstrings).
+.LP
+The #ctmpl directive determines the name of the file used as a template
+for the C source file that is generated
+.LP
+Each #file <filename> directive will result in a corresponding header
+file by that name containing the appropriate definitions as specified
+by command line options. A single C source file containing the
+declarations for the definitions in all the headers will be printed
+to stdout.
+.LP
+The #htmpl directive determines the name of the file used as a template
+for the C header file that is generated.
+.LP
+Each #table <tablename> directive will be processed in accordance with
+the ABI. On most platforms all tables will be catenated into a single
+table with the name of the first table for that file. To conform to
+the Intel ABI separate tables will be generated with the names indicated.
+.LP
+The template files specified by the #ctmpl and #htmpl directives
+are processed by copying line for line from the template file to
+the appropriate output file. The line containing the string
+.I <<<STRING_TABLE_GOES_HERE>>>
+is not copied to the output file. The appropriate data is then
+copied to the output file and then the remainder of the template
+file is copied to the output file.
+.SH BUGS
+makestrs is not very forgiving of syntax errors. Sometimes you need
+a trailing space after # directives, other times they will mess you
+up. No warning messages are emitted.
+.SH SEE ALSO
+SPARC Compliance Definition 2.2., SPARC International Inc.,
+535 Middlefield Road, Suite 210, Menlo Park, CA  94025
+.LP
+System V Application Binary Interface, Third Edition,
+ISBN 0-13-100439-5
+UNIX Press, PTR Prentice Hall, 113 Sylvan Avenue, Englewood Cliffs,
+NJ  07632
+.LP
+System V Application Binary Interface, Third Edition, Intel386
+Architecture Processor Supplement
+ISBN 0-13-104670-5
+UNIX Press, PTR Prentice Hall, 113 Sylvan Avenue, Englewood Cliffs,
+NJ  07632
+.LP
+System V Application Binary Interface, Third Edition, SPARC
+Architecture Processor Supplement
+ISBN 0-13-104696-9
+UNIX Press, PTR Prentice Hall, 113 Sylvan Avenue, Englewood Cliffs,
+NJ  07632
diff --git a/util/string.list b/util/string.list
new file mode 100644 (file)
index 0000000..49ba747
--- /dev/null
@@ -0,0 +1,398 @@
+! NOTE: To maintain binary compatibility, you can only APPEND items within
+!      a given list!!!!
+!
+! See the makestrs(1) manual.
+!
+
+#prefix Xt
+#feature XTSTRINGDEFINES
+#externref extern
+#externdef
+! note that the trailing space is required in the #externdef line.
+#ctmpl util/StrDefs.ct
+
+#file StringDefs.h
+#table XtStrings
+#htmpl util/StrDefs.ht
+
+Naccelerators
+NallowHoriz
+NallowVert
+NancestorSensitive
+Nbackground
+NbackgroundPixmap
+Nbitmap
+NborderColor
+Nborder borderColor
+NborderPixmap
+NborderWidth
+Ncallback
+Nchildren
+Ncolormap
+Ndepth
+NdestroyCallback
+NeditType
+Nfile
+Nfont
+NforceBars
+Nforeground
+Nfunction
+Nheight
+Nhighlight
+NhSpace
+Nindex
+NinitialResourcesPersistent
+NinnerHeight
+NinnerWidth
+NinnerWindow
+NinsertPosition
+NinternalHeight
+NinternalWidth
+NjumpProc
+Njustify
+NknobHeight
+NknobIndent
+NknobPixel
+NknobWidth
+Nlabel
+Nlength
+NlowerRight
+NmappedWhenManaged
+NmenuEntry
+Nname
+Nnotify
+NnumChildren
+Norientation
+Nparameter
+Npixmap
+NpopupCallback
+NpopdownCallback
+Nresize
+NreverseVideo
+Nscreen
+NscrollProc
+NscrollDCursor
+NscrollHCursor
+NscrollLCursor
+NscrollRCursor
+NscrollUCursor
+NscrollVCursor
+Nselection
+NselectionArray
+Nsensitive
+Nshown
+Nspace
+Nstring
+NtextOptions
+NtextSink
+NtextSource
+Nthickness
+Nthumb
+NthumbProc
+Ntop
+Ntranslations
+NunrealizeCallback
+Nupdate
+NuseBottom
+NuseRight
+Nvalue
+NvSpace
+Nwidth
+Nwindow
+Nx
+Ny
+CAccelerators
+CBackground
+CBitmap
+CBoolean
+CBorderColor
+CBorderWidth
+CCallback
+CColormap
+CColor
+CCursor
+CDepth
+CEditType
+CEventBindings
+CFile
+CFont
+CForeground
+CFraction
+CFunction
+CHeight
+CHSpace
+CIndex
+CInitialResourcesPersistent
+CInsertPosition
+CInterval
+CJustify
+CKnobIndent
+CKnobPixel
+CLabel
+CLength
+CMappedWhenManaged
+CMargin
+CMenuEntry
+CNotify
+COrientation
+CParameter
+CPixmap
+CPosition
+CReadOnly
+CResize
+CReverseVideo
+CScreen
+CScrollProc
+CScrollDCursor
+CScrollHCursor
+CScrollLCursor
+CScrollRCursor
+CScrollUCursor
+CScrollVCursor
+CSelection
+CSensitive
+CSelectionArray
+CSpace
+CString
+CTextOptions
+CTextPosition
+CTextSink
+CTextSource
+CThickness
+CThumb
+CTranslations
+CValue
+CVSpace
+CWidth
+CWindow
+CX
+CY
+RAcceleratorTable
+RAtom
+RBitmap
+RBool
+RBoolean
+RCallback
+RCallProc
+RCardinal
+RColor
+RColormap
+RCursor
+RDimension
+RDisplay
+REditMode
+REnum
+RFile
+RFloat
+RFont
+RFontStruct
+RFunction
+RGeometry
+RImmediate
+RInitialState
+RInt
+RJustify
+RLongBoolean Bool
+RObject
+ROrientation
+RPixel
+RPixmap
+RPointer
+RPosition
+RScreen
+RShort
+RString
+RStringArray
+RStringTable
+RUnsignedChar
+RTranslationTable
+RVisual
+RWidget
+RWidgetClass
+RWidgetList
+RWindow
+Eoff
+Efalse
+Eno
+Eon
+Etrue
+Eyes
+Evertical
+Ehorizontal
+EtextRead read
+EtextAppend append
+EtextEdit edit
+Extdefaultbackground
+Extdefaultforeground
+Extdefaultfont
+NfontSet
+RFontSet
+CFontSet
+
+#table XtStringsR6
+
+RGravity
+NcreateHook
+NchangeHook
+NconfigureHook
+NgeometryHook
+NdestroyHook
+Nshells
+NnumShells
+RCommandArgArray
+RDirectoryString
+REnvironmentArray
+RRestartStyle
+RSmcConn
+Hcreate
+HsetValues
+HmanageChildren
+HunmanageChildren
+HmanageSet
+HunmanageSet
+HrealizeWidget
+HunrealizeWidget
+HaddCallback
+HaddCallbacks
+HremoveCallback
+HremoveCallbacks
+HremoveAllCallbacks
+HaugmentTranslations
+HoverrideTranslations
+HuninstallTranslations
+HsetKeyboardFocus
+HsetWMColormapWindows
+HsetMappedWhenManaged
+HmapWidget
+HunmapWidget
+Hpopup
+HpopupSpringLoaded
+Hpopdown
+Hconfigure
+HpreGeometry
+HpostGeometry
+Hdestroy
+
+#file Shell.h
+#table XtShellStrings
+#htmpl util/Shell.ht
+
+NiconName
+CIconName
+NiconPixmap
+CIconPixmap
+NiconWindow
+CIconWindow
+NiconMask
+CIconMask
+NwindowGroup
+CWindowGroup
+Nvisual
+CVisual
+NtitleEncoding
+CTitleEncoding
+NsaveUnder
+CSaveUnder
+Ntransient
+CTransient
+NoverrideRedirect
+COverrideRedirect
+NtransientFor
+CTransientFor
+NiconNameEncoding
+CIconNameEncoding
+NallowShellResize
+CAllowShellResize
+NcreatePopupChildProc
+CCreatePopupChildProc
+Ntitle
+CTitle
+RAtom
+Nargc
+CArgc
+Nargv
+CArgv
+NiconX
+CIconX
+NiconY
+CIconY
+Ninput
+CInput
+Niconic
+CIconic
+NinitialState
+CInitialState
+Ngeometry
+CGeometry
+NbaseWidth
+CBaseWidth
+NbaseHeight
+CBaseHeight
+NwinGravity
+CWinGravity
+NminWidth
+CMinWidth
+NminHeight
+CMinHeight
+NmaxWidth
+CMaxWidth
+NmaxHeight
+CMaxHeight
+NwidthInc
+CWidthInc
+NheightInc
+CHeightInc
+NminAspectY
+CMinAspectY
+NmaxAspectY
+CMaxAspectY
+NminAspectX
+CMinAspectX
+NmaxAspectX
+CMaxAspectX
+NwmTimeout
+CWmTimeout
+NwaitForWm waitforwm
+CWaitForWm Waitforwm
+
+#table XtShellStringsR6
+
+Nwaitforwm
+CWaitforwm
+NclientLeader
+CClientLeader
+NwindowRole
+CWindowRole
+Nurgency
+CUrgency
+NcancelCallback
+NcloneCommand
+CCloneCommand
+Nconnection
+CConnection
+NcurrentDirectory
+CCurrentDirectory
+NdieCallback
+NdiscardCommand
+CDiscardCommand
+Nenvironment
+CEnvironment
+NinteractCallback
+NjoinSession
+CJoinSession
+NprogramPath
+CProgramPath
+NresignCommand
+CResignCommand
+NrestartCommand
+CRestartCommand
+NrestartStyle
+CRestartStyle
+NsaveCallback
+NsaveCompleteCallback
+NsessionID
+CSessionID
+NshutdownCommand
+CShutdownCommand
+NerrorCallback
+
diff --git a/xt.pc.in b/xt.pc.in
new file mode 100644 (file)
index 0000000..28ce24a
--- /dev/null
+++ b/xt.pc.in
@@ -0,0 +1,13 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+appdefaultdir=@appdefaultdir@
+
+Name: Xt
+Description: X Toolkit Library
+Version: @VERSION@
+Requires: xproto x11
+Requires.private: ice sm
+Cflags: -I${includedir}
+Libs: -L${libdir} -lXt